2013-03-04 88 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]; 
    } 
} 

我真的不知道我需要什麼方向頭...任何幫助將不勝感激! :)

回答