我正在使用[UIColor colorWithPatternImage:]
并期望它保留传入的图像。当我为传入的图像无效时,它会被释放,并且任何使用颜色绘制的尝试都会导致崩溃。这是预期的行为还是一个错误?
// MyCustomUIImage is a sub-class with it's own custom data provider
UIImage* encodedImage = [[MyCustomUIImage alloc] initWithContentsOfFile:fileName];
UIColor* color = [UIColor colorWithPatternImage:encodedImage];
// color is then assigned to a singleton so it is never deallocated
// ... later ...
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);
CGContextSetMiterLimit(ctx, 0.1f);
CGContextSetShouldAntialias(ctx, YES);
CGContextSetAllowsAntialiasing(ctx, YES);
CGContextAddPath(ctx, self.path);
CGContextSetLineWidth(ctx, width);
CGContextSetStrokeColorWithColor(ctx, color.CGColor);
CGContextSetFillColorWithColor(ctx, NULL);
if (self.glowAmount > 0.0f && self.glowColor.alpha > 0.0f)
{
CGContextSetShadowWithColor(ctx, CGSizeZero, self.glowAmount, self.glowColor.CGColor);
}
CGContextSetBlendMode(ctx, blendMode);
// *** CRASHES HERE ***
CGContextDrawPath(ctx, kCGPathStroke);
答案 0 :(得分:0)
如果您使用ARC,ARC可能会认为您的“颜色”从未再次使用过,因此会自动销毁它。它不会每次都出现。它可能会在内存不足时出现。
你可以像这样修理它:
UIColor* __autoreleasing color = [UIColor colorWithPatternImage:encodedImage];
答案 1 :(得分:0)
UIColor
的方法colorWithPatternImage
和initWithPatternImage.
事实证明,这两种方法使用了大量内存,比任何人预期的都要多。
而不是使用[UIColor initWithRed:0.25 green:0.25 blue:0.25 alpha:1];
或某些如何在当前图层后面使用UIImageView。
答案 2 :(得分:0)
UIColor会保留UIImage,但不会保留数据提供者。我正在发布数据提供程序,这导致了崩溃。