2012-01-24 5 views
5

가능한 복제를 바르를 해제하지 :
Why is object not dealloc'ed when using ARC + NSZombieEnabled이상한 ARC 문제가 UIView 하위에

내가 프로젝트에 지금보고 있어요 아주 이상한 문제가 발생했습니다

. 간단히 말해 은 ViewB (strong 속성)을 소유하고 있습니다. ViewA은 이니셜 라이저에 ViewB을 만듭니다. 두 객체 모두 서브 클래스가 UIView입니다.

모두에서 dealloc을 오버라이드했으며 로그 라인과 중단 점을 넣어 충돌이 발생하는지 확인합니다. ViewAdealloc이 맞았지만 ViewB의 것 같지 않습니다. 그러나 만약 self.viewB = nildealloc에 넣으면 ViewA이되고 입니다. viewB 아웃 전무 - 보내고 왜 내가 이해할 수없는 것은

@interface ViewA : UIView 
@property (nonatomic, strong) ViewB *viewB; 
@end 

@implementation ViewA 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     self.viewB = [[ViewB alloc] initWithFrame:self.bounds]; 
     [self addSubview:self.viewB]; 
    } 
    return self; 
} 

- (void)dealloc { 
    //self.viewB = nil; ///< Toggling this commented/uncommented changes if ViewB's dealloc gets called. 
    NSLog(@"ViewA dealloc"); 
} 

@end 

차이가 있습니다 :

그래서 기본적으로는 다음과 같이합니다. 뭔가 다른 사람이 viewB에 붙어 있다면 내가 그것을 없애거나 여기에 없으면 전혀 차이가 없어야합니다. 또한 ARC가 추가하는 릴리스 수에 차이를 두지 않습니다.

최소한의 테스트 케이스에서는 아직 그것을 재현하지 못했지만 아직 작업 중입니다. 그리고 나는 불행히도 이것을보고있는 실제 코드를 게시 할 수 없습니다. 나는 그것이 문제가되는 것을 보지 못한다. 왜냐하면 그것을 무시하는 것이 내가 혼란스러워하는 차이를 만들어서는 안된다는 것이 더 중요한 이유이기 때문이다.

누구나 내가이 부분을 간과하거나이 문제를 디버깅 할 곳을 찾는 데 도움이 될 수 있습니까?

업데이트 : 문제를 발견했습니다

. NSZombieEnabledYES으로 설정된 경우에만 문제가되는 것으로 보입니다. 글쎄, 그건 완전히 화가 났고 반드시 버그가되어야합니다. 좀비가 내가 아는 한 이것이 어떻게 작동하는지에 영향을주지 않아야합니다. 개체는 여전히 dealloc 메서드를 통과해야합니다. 그리고 더 많은 것은 무엇인지, 의 deallocviewB을 출력하지 않으면 작동한다는 것이 단지 미친 짓입니다.

+0

오프 토픽으로 '약한'상태로 만들 수 있으며 문제를 잊어 버릴 수 있습니다 :'[self addSubview : self.viewB]'는 당신을 위해'viewB'를 유지하기 때문에, 그것을 약한 참조로 유지하십시오. – dasblinkenlight

+0

iOS 4.3에서 실행해야하는 경우가 아니라면. –

+0

정확하게. iOS 4.x에서 실행하고 싶지만 ** 그렇게하지 않아도됩니다 **. 'dealloc'에서'viewB'를 사용하지 않는 것이 왜 효과가 있는지 보지 못합니다. 그것은 저에게 다만 미치게 보인다. – mattjgalloway

답변

4

이것이 iOS 구현의 버그 인 것으로 나타났습니다.

#import <Foundation/Foundation.h> 

@interface ClassB : NSObject 
@end 

@implementation ClassB 
- (id)init { 
    if ((self = [super init])) { 
    } 
    return self; 
} 
- (void)dealloc { 
    NSLog(@"ClassB dealloc"); 
} 
@end 

@interface ClassA : NSObject 
@property (nonatomic, strong) ClassB *b; 
@end 

@implementation ClassA 
@synthesize b; 
- (id)init { 
    if ((self = [super init])) { 
     b = [[ClassB alloc] init]; 
    } 
    return self; 
} 
- (void)dealloc { 
    NSLog(@"ClassA dealloc"); 
} 
@end 

int main() { 
    ClassA *a = [[ClassA alloc] init]; 
    return 0; 
} 

출력해야 그 : YESNSZombieEnabled 세트, 그것은 출력

ClassA dealloc 
ClassB dealloc 

그러나 :

ClassA dealloc 

를 지금까지 내가 말할 수있는이, 이것은이다 다음 코드를 고려 곤충. iOS (시뮬레이터와 장치 모두)에서만 발생하는 것으로 보이며 Mac OS X 용으로 빌드되고 실행될 때 발생하지 않습니다. Apple에 레이더를 제출했습니다.

편집 : 여기에 이미 답변되었습니다 - Why is object not dealloc'ed when using ARC + NSZombieEnabled. 진짜 문제가 무엇인지 알게 된 후에 발견 할 수있었습니다. ARC와는 아무런 관련이 없습니다.

+0

offtopic : no [super dealloc]; 전화? – CarlJ

+1

@meccan - 아니요, ARC를 사용하고 있습니다. – mattjgalloway

관련 문제