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가 해당 주소를 정확하게 나열하고 검색 할 때 주소를 찾을 수 있었던 것으로 보입니다.
retainCount가 objc_retainAutoreleasedReturnValue()에 의해 증가되고 retainCount가 string 메소드에 의해 문자열이 작성된 후 2라는 사실을 잊어 버렸습니다. 나는 [NSMutableString string]이 autoreleased 문자열을 반환하므로 objc_retainAutoreleasedReturnValue()가이를 유지한다고 생각한다. – lockedscope