2012-07-29 4 views
0

ARC가 활성화 된 Cocoa 앱이 있습니다. OS 10.8 및 Xcode 4.4를 사용하고 있습니다. 응용 프로그램은 산발적으로 콘솔에 다음과 같은 메시지를 덤핑, CGLayerRelease 호출에 충돌 :CGLayerRelease가 충돌 함

error for object 0x10a2d2000: entry for pointer being freed from death-row vanished 

나는 충돌이 정지 CGLayerRelease에 대한 호출을 주석 처리합니다. ARC 지원 프로젝트에서 CGLayerRelease를 호출해야합니까? 이 사실에 대한 문서는 명확하지 않습니다.

NSView에서 상속받은 클래스의 큰 파일에 퍼져 있기 때문에 코드를 게시하기가 어렵습니다. 이 클래스에는 데이터 멤버 CGLayerRef layer;이 있습니다. 그런 다음의 drawRect 기능 내부 :

if (layer == nil) { 
     layer = CGLayerCreateWithContext(context, self.frame.size, NULL); 
     // draw some stuff into CGLayerGetContext(layer) 
    } 
    CGContextDrawLayerInRect(context, self.bounds, layer); 

클래스는 또한 윈도우의 대리자이며

- (void)setPitch:(NSArray *)aPitch { 
    pitch = aPitch; 
    if (layer) { 
     //CGLayerRelease(layer); 
     layer = nil; 
    } 
} 

지금은 주석을 해제하는 경우 속성 setter 내부 또한 다음과 같은 기능

- (void)windowDidEndLiveResize:(NSNotification *)notification { 
    if (layer) { 
     //CGLayerRelease(layer); 
     layer = nil; 
    } 
    [self setNeedsDisplay:YES]; 
} 

있다 CGLayerRelease에 대한 호출 다음 나는 산발적으로 위에서 언급 한 충돌을 얻습니다. 스트레스가 항상 발생하지는 않기 때문에 "산발적으로"스트레스를받습니다.

+0

문제의 원인이되는 일부 코드가 표시 될 수 있습니까? – Vladimir

답변

0

예, ARC에서 CGLayerRelease()를 호출해야합니다. 위의 과제는 정확 하긴하지만 다른 사람들이있을 수 있다고 생각합니다. 이러한 종류의 충돌의 # 1 원인 인 ivars에 직접 액세스하고 있습니다. init 및 dealloc을 제외하고는 자신의 ivars에 액세스하지 마십시오. setLayer:에 대한 접근자를 만들어 이전 버전을 올바르게 릴리스하고 새 것을 만들고 항상 사용합니다.

CGLayer 코드가 훌륭하고 CGLayer에 추가 할 CGPath와 같은 것일 수 있습니다. 모든 ivars를 접근 자로 옮기십시오. 그렇지 않으면 영원히 이런 종류의 버그를 쫓을 것입니다.