2010-12-28 5 views
4

Есть ли у каждой нити собственный пул? Я пишу iPhone приложение, которое использует потоки. Если я не стану пул на нить, он жалуется на утечку.Нужно ли каждому потоку создать собственный пул авторефератов?

Что я хотел сделать, так это хранить какой-то объект, который переживает нить. Как мне это сделать?

ответ

7

Нет, каждый NSThread имеет свои собственные NSRunLoop, но не собственные NSAutoreleasePool. Таким образом, вы должны создать его, и если вы выполняете большую операцию или операцию, для которой требуется много времени, вы должны время от времени использовать пул, чтобы поддерживать низкий уровень памяти.

Хранилище объектов не связано нитью, вы можете получить доступ к каждому объекту из любого потока, который вы хотите, но возможно, что аксессор к объекту не является потокобезопасным и, таким образом, убивает ваше приложение. Однако это зависит от вашего приложения и вашего кода, а не от потоков.

+0

Итак, как я могу безопасно освободить пул NSAutorelease? Если я удалю его, есть жалобы на утечки. –

+0

Удалите его только в конце жизненного цикла ваших потоков, тем временем вам нужно воссоздать его, когда вам нужно удалить его по какой бы то ни было причине. – JustSid

+0

@John - Вам не следует удалять пул авторефератов. Создайте его в потоке, чтобы он мог управлять автореализованными объектами, но все, что вы хотите повесить после завершения потока, должно быть сохранено вручную (и позже выпущено вручную) или инициализировано с помощью '-init' или' copy'. –

3

Чтобы точно узнать, что сказал JustSid: при вызове объекта авторекламы используется объект autoreleasepool, связанный с текущим потоком. Поэтому, если к вашему потоку не привязано autoreleasepool, автореферат не будет работать, что приведет к утечке памяти.

Окончательный ответ: если ваш поток создает объект (ы) и рассчитывает на механизм авторекламы, чтобы освободить их, тогда вам нужно создать autoreleasepool для этого потока!

+0

Я пытаюсь сделать обратное, чтобы убедиться, что они не заходят в автореферат. –

+1

@ Джон Смит: Но внутренние функции Яблока также используют пулы авторефератов, поэтому их действительно трудно избежать. – JustSid

+0

Точно! Вот почему я всегда создаю один для каждого потока, за исключением случаев, если я уверен, что мне это не нужно. – VdesmedT

1

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

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