4

Does every thread have to have its own pool? I am writing an iPhone app which uses threads. If I do not put a pool on a thread it complains abut leaking.

What I wanted to do was to store some object which outlives the thread. How can I do it?

Brad Larson
  • 170,088
  • 45
  • 397
  • 571
John Smith
  • 12,491
  • 18
  • 65
  • 111

3 Answers3

7

No, every NSThread has its own NSRunLoop, but not its own NSAutoreleasePool. Thus you have to create one and if you are performing a large operation or a operation that needs a lot of time, you really should drain the pool from time to time to keep your memory footprint low.

Object storage isn't bound to a thread at all, you can access every object from every thread you want, but it is possible that the accessor to the object isn't threadsafe and thus kills your app. However, this depends on your app and your code and not on threads.

JustSid
  • 25,168
  • 7
  • 79
  • 97
  • So how can I safely release the NSAutorelease pool? If I remove it there are complaints of leaks. – John Smith Dec 28 '10 at 17:23
  • Remove it only at the end of your threads lifecycle, in the meantime you have to recreate it when you need to remove it for whatsoever reason. – JustSid Dec 28 '10 at 18:12
  • @John - You shouldn't remove the autorelease pool. Create it within the thread so that it can manage autoreleased objects, but anything you wish to hang around after the thread has finished executing should be manually retained (and later manually released), or initialized using `-init` or `copy`. – Brad Larson Dec 28 '10 at 20:40
3

To precise a little bit what JustSid said : When autorelease is called on an object, the autoreleasepool associated with the current thread is used. So if no autoreleasepool is associated with your thread, the autorelease will not work, leading to memory leak.

The final answer being : If your thread creates object(s) and count on the autorelease mechanism to release them, then you need to create an autoreleasepool for that thread !

VdesmedT
  • 9,037
  • 3
  • 34
  • 50
1

If you don't need a runloop associated with your thread, you'll need to create an autorelease pool manually. I would suggest that for transferring ownership of an object to another thread, you make it explicit rather than trying to rely on autorelease; have some sort of "take ownership" method called on a longer-lived thread that retains it.

Catfish_Man
  • 41,261
  • 11
  • 67
  • 84