2012-01-31 3 views
1

Я создал авторекламу. 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); 
} 
+0

Может быть, keepCount не 0? Запишите это свойство также с помощью [string retainCount] – matzino

+0

@matzino Это не будет никакой ценности - saveCount бессмысленна. – Till

+1

, кстати, вы должны использовать '[pool drain];' вместо '[pool release];'. –

ответ

4

Строки (NSString экземпляров и статически выделенные строки с @"") неизменяемы в Cocoa, поэтому, когда вы пытаетесь создать новый 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

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

Смежные вопросы