2010-09-13 4 views
1

Что происходит, когда мы пишем [Obj autorelease]?Что происходит, когда мы пишем [Obj autorelease] в пуле Autorelease?

Например:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];<br> 
NSMutableString *str = [[[NSMutableString alloc]initWithString:@""] autorelease];<br> 
NSLog(str);<br> 
[str appendString:@" I"];<br> 
NSLog(str);<br> 
[str appendString:@" like"];<br> 
NSLog(str);<br> 
[str appendString:@" programming"];<br> 
NSLog(str);<br> 
[pool drain];<br> 
NSLog(@"%@",str); //invalid 

Я смущен, потому что я прочитал, что «Вы можете добавить объект в текущий пул autorelease для последующего выпуска, отправив ему сообщение autorelease», поэтому, когда я пишу

NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease]; 

1) После выполнения вышеуказанного заявления Включена ли str в автореферат?

2) Если строка добавляется в autorelease бассейн, а затем, если мы ссылаемся ул после , что (до отпускания/осушение бассейн), как ...

[str appendString:@" I"]; 
NSLog(str); 
[str appendString:@" like"]; 
NSLog(str); 
[str appendString:@" programming"]; 
NSLog(str); 

тогда ссылка ул будет доступна из пула авторасчетов (поскольку str теперь добавляется в пул автозапуска) или из исходного места памяти str .... ??

Confusing ... !! Может ли кто-нибудь дать мне ясное представление об этом!

+0

Не используйте теги 'br'. Используйте кнопку «101010» для форматирования кода –

ответ

2

1) Да, всякий раз, когда вы отправляете сообщение об ошибке -autorelease, оно добавляется в пул автономии.

2) После выполнения следующей строки кода ...

NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease]; 

(который, кстати, можно было бы переписать, как это):

NSMutableString *str = [NSMutableString string]; 

... есть два ссылки на новую строку; один в пуле авторезистов, а второй в вашей локальной переменной str. Другими словами, каждый содержит адрес вашего строкового объекта. Таким образом, объект не находится в «пуле», больше, чем «в» переменной.

Когда вы отправляете сообщение -release в пул, оно отправляет -release сообщениям на объекты, которые в настоящее время ссылаются. Обратите внимание, что одному объекту может быть отправлено несколько сообщений -autorelease в заданном цикле, и в этом случае пул отправит соответствующее сообщение -release.

Если вы находите этот материал путаным, отличный способ получить больше информации - прочитать от Apple.

+1

Стоит расширять: 'str' не содержит объекта, равно как и пул. Исходная цепочка сообщений 'alloc',' init' и 'autorelease' возвращает указатель на объект, и это указатель, который вы помещаете в переменную. Когда вы отправляете сообщение 'autorelease' на объект, метод' autorelease' помещает тот же указатель в пул. Указатель находится в обоих местах; объект всегда находится только в одном месте, на которое указывают оба указателя. –