2013-02-01 6 views
0

왜이 기능이 작동을 멈췄는지 모르지만이 부분을 그리면 코드 조각이 내 장치를 크래킹합니다. 어떤 핵심이나 제안이 큰 도움이 될 수 있도록 코어 그래픽을 처음 접했습니다. 감사! 대신 일을Quartz 2D Drawing 크래킹

// Style 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Colors 
CGColorRef fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0].CGColor; 
CGColorRef fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0].CGColor; 

CGRect box = CGRectMake(5, 5, self.frame.size.width - 10, self.frame.size.height - 10); 
// Shadow 
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 1.0, fillBoxShadow); 
CGContextAddRect(context, box); 
CGContextFillPath(context); 
// Box 
CGContextSetFillColorWithColor(context, fillBox); 
CGContextAddRect(context, box); 

CGContextFillPath(context); 

답변

2

프로젝트는 다음 두 라인은 문제의 일부가 될 수있는, ARC를 사용하는 경우 :

CGColorRef fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0].CGColor; 
CGColorRef fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0].CGColor; 

ARC가 해제된다 UIColor 객체와 CGColorRef. CGColorRef를 유지 한 다음 완료하면 CGColorRef를 릴리스해야합니다.

는이 같은 코드 뭔가 작성합니다

UIColor *fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0]; 
UIColor *fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0]; 

를 다음 방법으로 나중에 fillBox.CGColor 및 fillBoxShadow.CGColor를 사용합니다.

+0

즉시 풀어지지는 않지만 runloop의 끝에서 :'colorWithRed ...'는 자동 렌더링 된 객체를 반환하는 팩토리 메소드입니다. 그것들은'@ autorelease' 블록의 끝에서, 또는 runloop 반복 후에 릴리즈됩니다. 문제는 어디에서 발생하지 않습니다. – Cyrille

+0

다른 것으로 시작하십시오. ARC는'CGRect box = CGRectMake (...);'코드보다 먼저 UIColor 객체를 해제합니다. 나는 기존 프로젝트를 ARC로 많은 달 전에 변환 할 때이 문제에 스스로 부딪쳤다 ... – JuliusO

+0

Negative. 그냥 내 코드 조각에 시도 :'CGColorRef white = [UIColor whiteColor] .CGColor; CGContextClearRect (ctx, rect); CGContextSetFillColorWithColor (ctx, white); CGContextAddPath (ctx, _bezier.CGPath); CGContextFillPath (ctx); 그리고 그것은 ARC에서 완벽하게 작동합니다. – Cyrille

0

CGContextAddRect(context, box); 
CGContextFillPath(context); 

CGContextFillRect를 사용해보십시오.

미리 컨텍스트에 추가하지 않은 경로는 채울 수 없습니다.

참고 :이

CGContextAddPath(context, [UIBezierPath pathWithRect:box].CGPath); 
CGContextFillPath(context); 

을 할 수 있지만, 조금 잔인한 단지 구형 영역을 채우는 비교입니다.

합니다 (pathWithRect: 구문에 대한 확실하지,하지만 존재한다.)

+0

'CGContextAddRect'는 컨텍스트의 현재 경로에 사각형을 추가합니다. 그렇게하는 두 가지 방법은 같습니다. 그래도 CGContextFillRect가 더 간단하고 따라서 동일한 채우기에 그려지는 것이 없을 때 더 좋습니다. –