2014-01-13 3 views
0

[UIColor colorWithPatternImage:]을 사용하고 있으며 전달 된 이미지를 유지할 것으로 예상됩니다. 전달 된 이미지가 0이면 할당이 취소되고 색상이 그려지면 충돌이 발생합니다. 이 예상되는 동작이나 버그입니까?[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

여기서 자동 복구가 어떻게 도움이됩니까? 변수는 절대로 해제되거나 nil'd되지 않습니다. – jjxtra

+0

@PsychoDad는 예기치 않게 유명한 UIColor 케이스를 보여줍니다. http://blog.bignerdranch.com/296-arc-gotcha-enexpectedly-short-lifetimes/. 코드가 충분하지 않기 때문에 ARC 때문에 '색상'이 파괴 된 것 같습니다. 축하해. 진짜 벌레를 찾았 어. –

0

UIColor의 방법 colorWithPatternImageinitWithPatternImage. 그것은이 두 가지 방법 중 하나가 기대보다 훨씬 더 많은 메모리를 사용 밝혀졌습니다.

대신 [UIColor initWithRed:0.25 green:0.25 blue:0.25 alpha:1];을 사용하거나 UIImageView를 현재 레이어 뒤에 사용하는 방법도 있습니다.

+0

불행히도 나는 사용자가 경로를 그리는 사람이기 때문에 이것을 할 수 없습니다. – jjxtra