0

ARC가 활성화되어 있으면 (XCode 4.3.2, iOS 4.0) _CFAutoreleasePoolPrintPools()토큰의 주소가 모든 풀에 인쇄되지 않습니다. 풀이 끝난 후 토큰이 예상대로 릴리스됨을 확인 했으므로 아무런 문제가 없지만 무언가 뒤떨어졌습니다. objc_autoreleaseReturnValue와 관련된 것으로 의심됩니다.NSMutableString이 _CFAutoreleasePoolPrintPools()에 의해 autoreleasepool에 나열되지 않음

@autoreleasepool { 
    NSMutableString *token = [NSMutableString string]; 
    // When following line uncommented, 
    // **token** is listed in autorelease pool by _CFAutoreleasePoolPrintPools. 
    //[token appendFormat:@"%@", @"xyz"]; 

    NSLog(@"%@", token); 

} 

따라서 _CFAutoreleasePoolPrintPools()는 신뢰할 수 있습니까? 토큰은 자동 릴리스 풀에 나열되어 있지 않지만 어떻게 자동 릴리스가 가능합니까?

편집 : 마침내 그 이유를 알아 냈고 이미 나열된 것으로 판단되면 appendFormat은 다르게 작동하지 않아야합니다. appendFormat을 호출하는 동안 메모리 주소가 ([1..F] XXX XXXX) 범위에 있었고 _CFAutoreleasePoolPrintPools가 해당 주소를 정확하게 나열하고 검색 할 때 주소를 찾을 수 있었던 것으로 보입니다.

답변

0

메모리 주소에 가장 왼쪽의 0이 물어 봤습니다. 토큰에 대해 반환 된 주소를 직접 복사하고 검색했습니다. NSMutableString 인스턴스는 실제로 _CFAutoreleasePoolPrintPools()에 의해 반환 된 목록에 __NSCFString으로 나타납니다.

(lldb) po token 
(NSMutableString *) $1 = 0x[-->0<--]898e690 

(lldb) po (NSString *)_CFAutoreleasePoolPrintPools() 
...  
objc[731]: [0x82dc1a8] ################ POOL 0x82dc1a8 
objc[731]: [0x82dc1ac]   0x898e690 __NSCFString 
3

objc_retainAutoreleaseReturnValue의 마술입니다. autoreleased 객체가 호출자에 의해 즉시 유지되면 autoreleased되지 않으므로 autorelease 풀에 나타나지 않습니다. 어셈블리 도우미 창을 가져 와서 [NSMutableString string] 호출에 대한 obj_msgSend 호출 직후에 objc_retainAutoreleaseReturnValue에 대한 호출을 확인합니다.

자세한 내용은 this blog post을 참조하십시오. 반환 다음

objc_autoreleaseReturnValue()를 검사 발신자의 지시 : 그것은 말한다 Apple code에 주석을 참조합니다. 호출자의 지시가 즉시 objc_autoreleaseReturnValue를 호출하면 호출 수신자는 -autorelease 을 생략하고 스레드 로컬 저장소에 결과를 저장합니다. 호출자가 협력하지 않으면 처럼 보이지만 호출 수신자는 평소와 같이 을 호출합니다.

objc_autoreleaseReturnValue는 반환 값이 스레드 로컬 저장소에있는 과 동일한 지 확인합니다. 값이 0이면 직접 값 이 사용됩니다. 그렇지 않은 경우, 값은 실제로 자동 릴리스 된 것으로 간주되며 이 다시 보유됩니다. 어느 경우이든 호출자는 이제 값에 대한 의 참조를 보유합니다.

태그가 지정된 포인터 개체는 메시지 전송을 저장하므로 빠른 자동 출시 체계에 참여합니다. 느린 경우에는 자동 릴리스 풀에 입력되지 않습니다.

+0

retainCount가 objc_retainAutoreleasedReturnValue()에 의해 증가되고 retainCount가 string 메소드에 의해 문자열이 작성된 후 2라는 사실을 잊어 버렸습니다. 나는 [NSMutableString string]이 autoreleased 문자열을 반환하므로 objc_retainAutoreleasedReturnValue()가이를 유지한다고 생각한다. – lockedscope

관련 문제