Об авто-выпуске / выпуске и [выпуске пула] - PullRequest
2 голосов
/ 02 апреля 2012

Это мой код:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string = [[NSString alloc] initWithFormat:@"s"];

[string autorelease];
NSLog(@"retainCount of string is %d", [string retainCount]);

[pool release];
NSLog(@"retainCount of string is %d", [string retainCount]);

Когда я пытаюсь понять autorelease и release, я запутался. если использовать [string autorelease], после отправки сообщения о выпуске в пул retainCount строки по-прежнему равен 1. Но используйте [string release] для замены [string autorelease], в конце концов retainCount строки будет равно 0. Что я знаю об autorelease: msgstr "добавить объект в текущий пул автоматического выпуска для последующего выпуска, отправив ему сообщение автоматического выпуска". Почему я отправил ему сообщение об автозапуске и освободил пул, я все еще могу получить доступ к объекту.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Вот в чем дело: retainCount - это деталь реализации. Вы никогда не можете полагаться на то, что это какая-то конкретная ценность. Все, что вам действительно нужно подумать, это то, являетесь ли вы владельцем объекта или нет.

После того, как вы распределили строку, она становится вашей. Когда вы автоматически освобождаете строку, она больше не принадлежит вам, и она может исчезнуть при сливе / освобождении пула автоматического выпуска. Если никто не владеет им, он исчезнет , когда вы освободите пул автоматического выпуска. В любом случае, вы не можете законно отправлять строковые сообщения после освобождения пула автоматического выпуска.

В текущей реализации строка создается с счетом сохранения 1. Авто-релиз не изменяет счет хранения. Когда пул освобождается, release отправляется всем объектам в нем, включая вашу строку. Код в релизе выглядит примерно так:

if (retainCount == 1)
{
    [self dealloc];
}
else
{
    retainCount--;
}

Таким образом, вы можете видеть, что счетчик никогда не упадет до нуля. Ваш окончательный NSLog работает, потому что память, используемая строкой, еще не была переработана.

0 голосов
/ 02 апреля 2012

Вы должны использовать [пул стока] вместо сообщения об освобождении, чтобы освободить все автоматически выпущенные объекты в пуле. Это сообщение будет называть [пул релиз] для вас.

...