2013-03-04 58 views
2

好吧,这是发生了什么...我有一个UIView子类,其中包括两点(开始和结束),这两点之间的CGPath和很多UILabels。如果我将UIView子类添加为我的scrollview子视图(位于基于CATiledLayer的UIView顶部),那么我的应用程序开始获取内存警告并最终崩溃。但是,如果我移除包含点和路径的UIView子类,并保持CATiledLayer视图不变,那么所有功能都可以正常工作,并且不会发生崩溃或内存警告。CATiledLayer子视图导致内存警告和崩溃

有没有人有任何想法,为什么发生这种情况?内容视图不应该有太大的问题,因为我只绘制最大宽度为40px的标签和一个CGPath,它也很小?

这是一个地图应用

下面是一些代码:

//Display the map image 
- (void)displayTiledImageNamed:(NSString *)imageName size:(CGSize)imageSize { 
    self.zoomScale = 1.0; 

    container = [[UIView alloc] initWithFrame:(CGRect){ CGPointZero, imageSize }]; 

    _zoomView = [[UIImageView alloc] initWithFrame:(CGRect){ CGPointZero, imageSize }]; 
    NSString *path = [NSString stringWithFormat:@"%@/%@-Small.png",[[NSBundle mainBundle] bundlePath], [imageName stringByDeletingPathExtension]]; 
    UIImage *zoomImage = [UIImage imageWithContentsOfFile:path]; 
    [_zoomView setImage:zoomImage]; 

    [container addSubview:_zoomView]; 
    [_zoomView release]; 

    _tilingView = [[UMTileView alloc] initWithImageName:imageName size:imageSize]; 
    _tilingView.frame = _zoomView.bounds; 
    [_zoomView addSubview:_tilingView]; 
    [_tilingView release]; 

    [self configureForImageSize:imageSize]; 

    //This is the view that's causing the crash and memory warnings 
    //If this view is commented out the app functions just fine 
    UMMapContentView *m = [[UMMapContentView alloc] initWithFrame:CGRectMake(0,0,imageSize.width,imageSize.height) andColors:self.colors mapView:self.mapView]; 
    self.contentView = m; 
    [container addSubview:self.contentView]; 
    [m release]; 

    [self addSubview:container]; 
    [container release]; 
} 

这是上面的UMMapContentView视图内的另一个子视图这是我的路视图类:

+ (Class)layerClass { 
    return [CATiledLayer class]; 
} 

+ (CFTimeInterval)fadeDuration { 
    return 0.0; 
} 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.userInteractionEnabled = NO; 
     self.backgroundColor = [UIColor clearColor]; 
    } 
    return self; 
} 

- (void)dealloc { 
    self.path = nil; 
    self.pathColor = nil; 
    [super dealloc]; 
} 

- (void)resetPathView { 
    CATiledLayer *tiledLayer = (CATiledLayer*)self.layer; 
    tiledLayer.contents = nil; 
    [tiledLayer setNeedsDisplay]; 
} 

- (void)drawPath:(UMPath*)p { 
    self.path = p; 
    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect { 
    if (self.path) { 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextSetStrokeColorWithColor(context, self.pathColor.CGColor); 
     CGContextSetShadowWithColor(context, CGSizeMake(2.0, 1.0), 1.0, [[UIColor colorWithWhite:0.2 alpha:0.8] CGColor]); 
     CGContextSetLineWidth(context, 8.0); 
     CGContextBeginPath (context); 
     CGContextMoveToPoint (context, ((UMMapPoint*)[self.path.points objectAtIndex: 0]).x, ((UMMapPoint*)[self.path.points objectAtIndex: 0]).y); 
     for (int i = 1; i < self.path.points.count; i++) { 
      CGContextAddQuadCurveToPoint (context, ((UMMapPoint*)[self.path.points objectAtIndex:i-1]).x, ((UMMapPoint*)[self.path.points objectAtIndex: i-1]).y, ((UMMapPoint*)[self.path.points objectAtIndex:i]).x, ((UMMapPoint*)[self.path.points objectAtIndex:i]).y); 
     } 
     CGContextStrokePath (context); 
    } 
} 

这是我的方法将所有UILabel放入UMMapContentView视图中:

- (void)mapAllLabelsInNavigationMap:(int)navigationMap { 

    //There are 1109 label dictionaries in the labels array 
    for (NSDictionary *dict in labels) { 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake([[dict objectForKey:@"X"] floatValue],[[dict objectForKey:@"Y"] floatValue],[[dict objectForKey:@"Width"] floatValue],[[dict objectForKey:@"Height"] floatValue])]; 
     [label setLineBreakMode:NSLineBreakByWordWrapping]; 
     [label setNumberOfLines:0]; 
     [label setBackgroundColor:[UIColor clearColor]]; 
     [label setTextColor:[self colorFromHexString:[dict objectForKey:@"Foreground"]]]; 
     [label setFont:[UIFont systemFontOfSize:[[dict objectForKey:@"FontSize"] floatValue]]]; 
     [label setTextAlignment:NSTextAlignmentCenter]; 
     [label setText:[[UMDataBase shared] stringForID:[[dict objectForKey:@"Texts_ID"] intValue] withLanguage:languageID]]; 

     [self addSubview:label]; 
     [localMapLabels addObject:label]; 
     [label release]; 
    } 
} 

我真的不知道我需要什么方向头...任何帮助将不胜感激! :)

回答