Каждый поток нуждается в своем собственном пуле автоматического выпуска? - PullRequest
4 голосов
/ 28 декабря 2010

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

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

Ответы [ 3 ]

7 голосов
/ 28 декабря 2010

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

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

3 голосов
/ 28 декабря 2010

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

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

1 голос
/ 29 декабря 2010

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

...