2014-01-13 5 views
0

Я использую [UIColor colorWithPatternImage:] и ожидал, что он сохранит полученное изображение. Когда я потеряю изображение, которое передано, оно освобождается, и любая попытка рисования с цветом приводит к сбою. Это ожидаемое поведение или ошибка?Имеет ли [UIColor colorWithPatternImage:] сохранение UIImage?

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

Вам не нужно беспокоиться о том, сохраняется ли изображение, если экземпляр UIColor правильно управляется, и вы не пытаетесь изменить изображение самостоятельно после потери владельца. Скорее всего, это ошибка в вашем коде. – NSAdam

+3

Возможно, может показаться некоторый код. – Mike

+0

Я думаю, что у меня была аналогичная проблема, я должен был убедиться, что изображение действительно отображается первым, прежде чем я смог установить его на ноль. Поэтому вам нужно подождать один цикл вашего основного потока! –

ответ

0

UIColor сохраняет UIImage, но не сохраняет поставщика данных. Я выпускал поставщика данных, и это вызывало крах.

0

Если вы используете ARC, ARC может подумать, что ваш «цвет» больше никогда не будет использоваться, поэтому он автоматически уничтожит его. Он не будет появляться каждый раз. Это может появиться при низкой памяти.

вы можете исправить это следующим образом:

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

Я не вижу, как '__autoreleasing' решит эту проблему. также OP сказал: «// затем цвет присваивается одному элементу, поэтому он никогда не освобождается» –

+0

Как здесь помогает автореализацию? Переменная никогда не освобождается или нильд. – jjxtra

+0

@PsychoDad покажет вам знаменитый неожиданно разрушающий случай UIColor. http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes/. Из-за вашего кода недостаточно, я думаю, что ваш «цвет» уничтожается из-за ARC. Поздравляем вас с настоящей ошибкой. –

0

UIColor «s методы colorWithPatternImage и initWithPatternImage. Оказывается, эти два метода используют много памяти, намного больше, чем какой-либо можно было бы ожидать.

вместо этого используется [UIColor initWithRed:0.25 green:0.25 blue:0.25 alpha:1]; или какой-либо способ использования UIImageView за вашим текущим уровнем.

+0

К сожалению, я не могу сделать это, так как пользователь является тем, кто рисует путь. – jjxtra