Почему объект авто-релиза еще жив? - PullRequest
1 голос
/ 31 января 2012

Я создал пул автоматического выпуска.localString добавил в этот пул.Я выпустил бассейн.localString и строка должны быть освобождены.Но на самом деле они все еще живы.Вы можете увидеть мой журнал:

Why is the string object still alive? I don't know. 

и код:

-(NSString*) happyString
{
 NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];
 return localString;
}

-(IBAction) onButton:(id)sender
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 NSString *string = [self happyString];
 [pool release]; 

 NSLog(@"Why is the string object still alive? %@", string);  
}

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Строки (NSString экземпляры и статически размещенные строки с @"") неизменны в Какао, поэтому при попытке создать новый NSString из статически распределенного класса NSString может выполнить оптимизацию: новый экземпляр NSString не создается (объект, созданный при вызове -alloc, немедленно освобождается), и возвращается ссылка на статически размещенную строку. То есть строка:

NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];

Фактически эквивалентно:

NSString *localString = @"I don't know.";

(Если вы проверите адреса памяти этих двух объектов, вы увидите, что они одинаковы.) Поскольку этот тип строки не может быть освобожден, он не исчезает, когда вы ожидаете этого.

Если вы создадите свою строку способом, который не может быть оптимизирован, например:

NSString *localString = [[[NSString alloc] initWithFormat:@"%@", @"I don't know."] autorelease];

Тогда ваш код будет вести себя так, как вы ожидаете, и ваше приложение (надеюсь) будет аварийно завершено в вашей строке NSLog.

0 голосов
/ 31 января 2012

Если вы пробовали какие-либо классы (любые пользовательские классы), кроме NSString, то он не был бы живым.

...