Можно ли добавить объект в конкретный пул автоматического выпуска? - PullRequest
0 голосов
/ 28 апреля 2009

В документации есть метод addObject: NSAutoreleasePool.

Я думал об этом:

NSString * myString = [[NSString alloc] initWithCString: "Это работает?"]; [thePool addObject: myString]; [anotherPool addObject: myString];

Это возможно? Я всегда читаю, что могу добавлять объекты только к самому верхнему в стеке пула автоматического выпуска.

Ответы [ 3 ]

6 голосов
/ 29 апреля 2009

Да, вы можете. Но ты никогда не должен. Категорически нет причин делать это.

2 голосов
/ 29 апреля 2009

То, что вы делаете, возможно, но может вызвать исключение во время выполнения, потому что myString будет отправлено сообщение -release после освобождения (при условии, что последняя оставшаяся ссылка находится у первого пула). В целом, как указано в документации -[NSAutoreleasePool addObject:] , вам не следует вручную добавлять объект в пул автоматического выпуска, а вызывать -autorelease для этого объекта. Это поместит объект в пул активного автоматического выпуска для текущего потока (каждый поток имеет свой собственный пул автоматического выпуска).

0 голосов
/ 29 апреля 2009

Я немного растерялся из-за этого от Apple:

Когда объект автоматически освобожден - это когда объект отправляется автоматическое сообщение или когда оно передан в качестве аргумента addObject: метод класса - это всегда положить в пул автозапуска наверху стека.

С другой стороны, они не упоминают об этом в Ссылке класса NSAutoreleasePool. Поэтому я предполагаю, что даже когда я вызываю addObject: для определенного объекта, он попадает в тот, что находится над стеком пула автоматического выпуска. На самом деле мне придется попробовать это;)

...