Ios [UIColor Color WithPatternImage:]是否保留UIImage?

Ios [UIColor Color WithPatternImage:]是否保留UIImage?,ios,uikit,quartz-2d,Ios,Uikit,Quartz 2d,我正在使用[uicolorWithPatternImage:并希望它保留传入的图像。当我将传入的图像置零时,它将被解除分配,任何使用该颜色绘制的尝试都会导致崩溃。这是预期的行为还是错误 // MyCustomUIImage is a sub-class with it's own custom data provider UIImage* encodedImage = [[MyCustomUIImage alloc] initWithContentsOfFile:fileName]; UICol

我正在使用
[uicolorWithPatternImage:
并希望它保留传入的图像。当我将传入的图像置零时,它将被解除分配,任何使用该颜色绘制的尝试都会导致崩溃。这是预期的行为还是错误

// 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);

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

您可以这样修复它:

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

UIColor
的方法
colorWithPatternImage
initWithPatternImage.
结果表明,这两种方法使用了大量内存,比任何人预期的都多


而不是使用
[UIColor initWithRed:0.25绿色:0.25蓝色:0.25阿尔法:1]或如何在当前图层后面使用UIImageView。

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

只要UIColor实例得到正确管理,并且在失去所有权后您不尝试自己修改图像,您就不必担心图像是否会被保留。很可能这是代码中的一个错误。也许显示一些代码可能会有所帮助。我想我也遇到了类似的问题,我必须先确保图像确实显示出来,然后才能将其设置为零。因此,您必须等待主线程的一个周期!我看不出自动释放将如何解决这个问题。OP还说“//color然后被分配给一个单件,所以它永远不会被释放”自动释放在这里有什么帮助?变量永远不会被释放或为零。@PsychoDad向您展示一个著名的UIColor意外破坏案例。因为你的代码不够,我认为你的
颜色
是因为弧形而被破坏的。恭喜你找到了真正的bug。很有趣。感谢有价值的链接:)不幸的是,我不能这样做,因为用户是绘制路径的人。