С ARC поддержки (XCode 4.3.2, IOS 4,0), _CFAutoreleasePoolPrintPools() не печатает адрес маркеров в любых бассейнах. Я проверил, что токен выпущен, как ожидается, после окончания пула, поэтому нет проблем, но что-то идет за сценой. Я подозреваю, что это может быть связано с objc_autoreleaseReturnValue.NSMutableString не перечислен в autoreleasepool по _CFAutoreleasePoolPrintPools()
@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 2 после того, как строка создается с помощью метода строки. Я думаю, что [строка NSMutableString] возвращает строку с автореализацией, поэтому objc_retainAutoreleasedReturnValue() сохраняет ее. – lockedscope