2012-11-21 3 views
0

나는Objective C에서 포인터를 비교할 때 내 코드에 어떤 문제가 있습니까?

static __weak ExplorerController *_rootExplorer = nil; 

작동
_rootExplorer = self;    
NSAssert(_rootExplorer == self, @"????"); 

있습니다.

는 할당 해제, 나는 거짓이

bool b = _rootExplorer == self; 

을하려고하지만, 디버거는 분명 두 객체가 동일하고 동일한 물리적 주소를 말한다. 내가

long n = (long) (_rootExplorer); 
long n2 = (long) (self); 

을 수행 할 때

나는 n에 대한 n2 제로에 매우 큰 값을 얻는다. 그러나 _rootExplorernil이 아닙니다. 그러나 다른 기능에서 동일한 작업을 수행하는 경우 dealloc, nn2은 동일합니다.

내 코드에 어떤 문제가 있습니까? 스택의 내비게이션 컨트롤러 중 하나에 대한 약한 참조를 유지하려고 시도하고 unwinding 중에 리소스를 해제해야하지만 참조 된 컨트롤러 만이이를 수행 할 수 있습니다.

답변

1

Apple의 ARC documentation은 "객체에 대한 강력한 참조가없는 경우 약한 참조가 nil로 설정됩니다."라고 말합니다. 그래서, 나는 당신의 코드에 문제가 있다고 생각하지 않는다. (... 어떤면에서는 ARC가 작업을 한 후에 그 위치가 달라진다.)

1

아마도 여러분은 _rootExplorer에게 메시지를 보내서 정리하도록 할 생각입니까? 그렇다면 메시지를 보내십시오. 실제로 메시지가 없으면 메시지가 무시되고 아무런 피해도 없습니다.

그리고 정말로 그렇지 않다면 어딘가에 버그가 발생하여 dealloc 이전에 그런 식으로 설정되어있을 것입니다. 아마도 가리키는 대상이 할당 해제되었을 것입니다.

특히, lldb를 사용하는 경우 디버거가 값을 올바르게 읽지 못하는 경우가 있습니다. 이 영역에는 알려진 버그가 있습니다. 레이스가있을 수도 있습니다 - 아마도 자신의 객체와 같은 시간에 _rootExplorer가 할당 해제되고 디버거에서 멈추는 것이 발생하는 순서가 변경되는 것일 수 있습니다.

관련 문제