가능한 복제를 바르를 해제하지 :
내가 프로젝트에 지금보고 있어요 아주 이상한 문제가 발생했습니다
Why is object not dealloc'ed when using ARC + NSZombieEnabled이상한 ARC 문제가 UIView 하위에
. 간단히 말해 은 ViewB
(strong
속성)을 소유하고 있습니다. ViewA
은 이니셜 라이저에 ViewB
을 만듭니다. 두 객체 모두 서브 클래스가 UIView
입니다.
모두에서 dealloc
을 오버라이드했으며 로그 라인과 중단 점을 넣어 충돌이 발생하는지 확인합니다. ViewA
의 dealloc
이 맞았지만 ViewB
의 것 같지 않습니다. 그러나 만약 self.viewB = nil
을 dealloc
에 넣으면 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가 추가하는 릴리스 수에 차이를 두지 않습니다.
최소한의 테스트 케이스에서는 아직 그것을 재현하지 못했지만 아직 작업 중입니다. 그리고 나는 불행히도 이것을보고있는 실제 코드를 게시 할 수 없습니다. 나는 그것이 문제가되는 것을 보지 못한다. 왜냐하면 그것을 무시하는 것이 내가 혼란스러워하는 차이를 만들어서는 안된다는 것이 더 중요한 이유이기 때문이다.
누구나 내가이 부분을 간과하거나이 문제를 디버깅 할 곳을 찾는 데 도움이 될 수 있습니까?
업데이트 : 문제를 발견했습니다
. NSZombieEnabled
이 YES
으로 설정된 경우에만 문제가되는 것으로 보입니다. 글쎄, 그건 완전히 화가 났고 반드시 버그가되어야합니다. 좀비가 내가 아는 한 이것이 어떻게 작동하는지에 영향을주지 않아야합니다. 개체는 여전히 dealloc
메서드를 통과해야합니다. 그리고 더 많은 것은 무엇인지, 의 dealloc
에 viewB
을 출력하지 않으면 작동한다는 것이 단지 미친 짓입니다.
오프 토픽으로 '약한'상태로 만들 수 있으며 문제를 잊어 버릴 수 있습니다 :'[self addSubview : self.viewB]'는 당신을 위해'viewB'를 유지하기 때문에, 그것을 약한 참조로 유지하십시오. – dasblinkenlight
iOS 4.3에서 실행해야하는 경우가 아니라면. –
정확하게. iOS 4.x에서 실행하고 싶지만 ** 그렇게하지 않아도됩니다 **. 'dealloc'에서'viewB'를 사용하지 않는 것이 왜 효과가 있는지 보지 못합니다. 그것은 저에게 다만 미치게 보인다. – mattjgalloway