0

의 retainCount을 변경, 그래서 나는 관찰 세트 : 내가 내 클래스의 인스턴스가 자체의 속성을 관찰하는 것이 필요 오브젝트

[self addObserver:self forKeyPath:@"myProperty" options:NSKeyValueObservingOptionNew context:nil] 

와의 dealloc에서

단순히 관찰자를 확인하고 제거 :

- (void)dealloc 
{ 
    if ([self observationInfo]) 
    { 
     [self removeObserver:self]; 
    } 
} 

이 프로젝트는 ARC하에 있으며, iOS 6 SDK 이전의 모든 프로젝트는 정상적으로 작동합니다. 그러나 iOS 6 SDK를 사용하면 이 (가) dealloc EX_BAD_ACCESS (해제 메시지가 할당 취소 된 인스턴스로 전송 됨) 이후에 개체 및 앱의 retainCount가 증가합니다.

이 코드의 잘못된 점은 무엇입니까? 그것은 애플의 BUG인가 내 것이냐?

thread #1: tid = 0x1f03, 0x016b60ab libobjc.A.dylib`objc_release + 27, stop reason = EXC_BAD_ACCESS (code=1, address=0xff000002) 

frame #0: 0x016b60ab libobjc.A.dylib`objc_release + 27 
frame #1: 0x016b6bd9 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 555 
frame #2: 0x02538468 CoreFoundation`_CFAutoreleasePoolPop + 24 
frame #3: 0x0253cafd CoreFoundation`__CFRunLoopRun + 1933 
frame #4: 0x0253bf44 CoreFoundation`CFRunLoopRunSpecific + 276 
frame #5: 0x0253be1b CoreFoundation`CFRunLoopRunInMode + 123 
frame #6: 0x024f07e3 GraphicsServices`GSEventRunModal + 88 
frame #7: 0x024f0668 GraphicsServices`GSEventRun + 104 
frame #8: 0x0022e65c UIKit`UIApplicationMain + 1211 
frame #9: 0x00001efd MyProjects`main + 141 at main.m:16 
+0

정보가 충분하지 않습니다. 첫째,'retainCount'는 도움이되지 않는 쓸모가 없습니다. 둘째, 충돌이 있으면 백 트레이스를 게시하십시오. – bbum

+0

stacktrace를 추가합니다. 자동 복구 풀만 청소합니다. 내 견해는 observationInfo를 얻는 데있어서의 문제입니다. [self observationInfo]를 호출하면 self.retainCount가 변경됩니다 (iOS 6 SDK에서만 증가). 나는 그것이 매우 이상한 행동이라고 생각한다. – Killer

+0

단순히 설정자를 무시하는 대신 속성을 관찰하는 이유가 있습니까? – jrturton

답변

0

-observationInfo이 설계되지 않았습니다 :

UPDATE 스택 트레이스 있습니다. KVO를 설정했는지 여부를 알아야하는 경우 일종의 플래그를 인스턴스 변수로 저장하십시오.

6

[self observationInfo]으로 전화 할 때 보유 및 자동 복구는 self입니다. 그러나 이미 dealloc에 있기 때문에 자동 회수 풀이 비우기 전에 객체의 할당이 해제됩니다. 그래서 autorelease pool이 결국 배수 될 때, 그것은 당신의 now-deallocated 객체를 해제하고 충돌을 시도합니다. 스택 추적에서이를 볼 수 있습니다. 프레임 2는 CFAutoreleasePoolPop에 대한 호출입니다.이 함수는 자동 출시 풀을 소모합니다.

관련 문제