2011-02-11 4 views
0

편집 : 문제가 직접 해결되었습니다. UTFutton이 두 번 릴리즈되는 원인이되는 dealloc 메서드의 나머지 부분이 있음을 알게되었습니다.addSubview UIViewController, 뷰 오버가 해제 됨

팝업과 같은 다른 UIViewController 위에 UIViewController를 표시하려고합니다. 문제는보기가 너무 많이 공개되고있는 것 같습니다.

[CALayer release]: message sent to deallocated instance 0x784bf40

내가보기를 추가하려면이 코드를 사용 : NSZombieEnabled으로, 나는 다음과 같은 오류 얻을 나중에 그런

//self.someViewController is declared as (nonatomic, retain) 
self.someViewController = [[[SomeViewController alloc] initWithDelegate:self] autorelease]; 
[self.view addSubview:self.someViewController.view]; 

를,이 같은 뷰를 제거 :

[self.someViewController.view removeFromSuperview]; 
self.someViewController = nil; 
+0

dont autorelease it! – Robin

+0

'someViewController'의 선언은 무엇입니까? – jv42

+0

re : robin => 그는 속성에 지정하고 있습니다. 속성이 retain (또는 copy)이면 autorelease해야합니다. – jv42

답변

1

이전의 주석은이 문제를 해결하지 못하면 아마도 도움이 될 것입니다. 나는 (적어도 나는 그것이 작동하는 방법을 볼 수 있습니다) 당신은 내가 당신의 코드가 정확한지 생각이 경우이

@property (nonatomic, retain) NSViewController* someViewController; 

처럼 someViewController 속성을 만든 assumning하고있어 여기에 보조 충돌을 볼 수 있습니다.

e.e. 이 즉시 메모리를 확보해야한다

self.someViewController = nil; 

를 호출 할 때 (프레임은 VC이 때문에 오토 릴리즈 카운트가 이미 감소되어있는 곳으로 갔다 가정). 그러므로 someViewController VC에서 여전히 다른 객체를 사용하고 있고 someViewController 객체로 설정된 delegate를 가지고 있고 배경 작업을하고 있다면, 현재 할당 해제 된 객체를 다시 호출하려고 할 때 충돌이 발생할 것입니다. (만약 당신이 VC를 풀지 않는다면이 충돌은 보이지 않을 것입니다.)

예를 들어 MKMapKit을 someViewController에 표시하고 delegate를 someViewController로 설정하면 ... someViewController에서 메소드를 구현 한 경우 당신이 당신 전에 MKMapView 개체를 파괴하지 않은 경우

mapViewDidFinishLoadingMap:(MKMapView*)mapView 

MKMapKit는 또 다른 스레드에서이 호출 할 수있다.

나는 항상이 위험을 피하기 위해 사용하는 VC를 파괴하기 전에 VC (MKMapView와 같은)를 가리키는 다른 객체 델리게이트를 nil로 설정합니다. PDF 렌더링 (CALayer?)에서는 다른 메모리 할당/자유 패러다임을 사용하여 명시 적으로 객체를 릴리스해야 할 수도 있습니다.

+0

someViewController를 이미 확인하고 다른 모든 객체 델리게이트가 'dealloc'에 nil로 설정되어 있는지 확인했습니다. – Rengers

0

직접 문제가 해결되었습니다. Dualloc 메서드에서 UIButton이 두 번 릴리스되는 원인이 남아있는 것으로 밝혀졌습니다.

관련 문제