Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

3年前关闭。



Improve this question




好吧,这就是发生的事情...我有一个UIView子类,它包含两个点(开始和结束),这两个点之间的CGPath以及许多UILabel。如果我将该UIView子类作为子视图添加到滚动视图中(在基于CATiledLayer的UIView之上),则我的应用程序开始收到内存警告,并最终崩溃。但是,如果删除包含点和路径的UIView子类,并保持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];
    }
}

我不太确定我应该朝哪个方向前进。任何帮助将不胜感激! :)

最佳答案

您没有提供UMMapContentView的源代码,但是如果它使用CATiledLayer,则可能是问题所在。看来您无法对CATiledLayer支持的视图进行子视图。

滚动到底部(在评论部分):http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

如果您以任何方式编写自己的平铺图层,可能会更容易。大量的错误时,CATiledLayer的文档很少。

关于ios - CATiledLayer subview 导致内存警告和崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15193467/

10-13 02:26