[UIColor colorWithPatternImage:]是否保留UIImage?

时间:2014-01-13 03:25:54

标签: ios uikit quartz-2d

我正在使用[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);

3 个答案:

答案 0 :(得分:0)

如果您使用ARC,ARC可能会认为您的“颜色”从未再次使用过,因此会自动销毁它。它不会每次都出现。它可能会在内存不足时出现。

你可以像这样修理它:

UIColor* __autoreleasing color = [UIColor colorWithPatternImage:encodedImage];

答案 1 :(得分:0)

UIColor的方法colorWithPatternImageinitWithPatternImage.事实证明,这两种方法使用了大量内存,比任何人预期的都要多。

而不是使用[UIColor initWithRed:0.25 green:0.25 blue:0.25 alpha:1];或某些如何在当前图层后面使用UIImageView。

答案 2 :(得分:0)

UIColor会保留UIImage,但不会保留数据提供者。我正在发布数据提供程序,这导致了崩溃。