[MonoTouch] NSAutoreleaseNoPool error messages when using threads
Geoff Norton
gnorton at novell.com
Mon Oct 12 11:30:58 EDT 2009
Ed,
We handle the NSAutoreleasePool for you on the main thread, but
when you spin up threads that touch obj-c objects, you need to manage
the pool yourself. I suggest:
using (NSAutoreleasePool pool = new NSAutoreleasePool ()) {
// your worker code
}
-g
On 12-Oct-09, at 11:27 AM, Ed Anuff wrote:
> Possibly, although the idea here is not to halt the main tread while
> loading images from the net. I've worked around it by putting this at
> the start of the thread code:
>
> NSAutoreleasePool pool = new NSAutoreleasePool();
>
> According to the Apple docs, I'd have to do this at the start of a
> thread I was creating in Obj-C, but this is the first time I've had to
> worry about memory management with MonoTouch.
>
> Ed
>
> On Mon, Oct 12, 2009 at 6:53 AM, Terry Westley
> <monotouch at sabonrai.com> wrote:
>> You could be doing something that needs to be performed on the main
>> UI
>> thread. If so, look into NSObject.InvokeOnMainThread and
>> NSObject.BeginInvokeOnMainThread.
>>
>> --Terry
>>
>> On Mon, Oct 12, 2009 at 3:19 AM, Ed Anuff <ed at anuff.com> wrote:
>>>
>>> I'm getting a lot of the following messages when I create a thread
>>> and
>>> create some objects inside of it that aren't used outside of the
>>> thread:
>>>
>>> 009-10-12 00:10:57.977 TouchClient[79105:4a03] ***
>>> _NSAutoreleaseNoPool(): Object 0x4966790 of class NSURL autoreleased
>>> with no pool in place - just leaking
>>> Stack: (0x62a6bf 0x58be62 0x5cb8a1 0x8ef58ce 0x8ef52da 0x8ef4d2e
>>> 0x4dd0490 0xca9d 0x1568d4 0x18fd8b 0x1c43c6 0x1eea08 0x96926f39
>>> 0x96926dbe)
>>> 2009-10-12 00:10:57.979 TouchClient[79105:4a03] ***
>>> _NSAutoreleaseNoPool(): Object 0x4abb80 of class NSCFString
>>> autoreleased with no pool in place - just leaking
>>> Stack: (0x62a6bf 0x58be62 0x5d8b0a 0x5e2f24 0x5e2ee8 0x8ef58ce
>>> 0x8ef5bdc 0x8ef4d3c 0x4dd0490 0xca9d 0x1568d4 0x18fd8b 0x1c43c6
>>> 0x1eea08 0x96926f39 0x96926dbe)
>>> 2009-10-12 00:10:57.980 TouchClient[79105:4a03] ***
>>> _NSAutoreleaseNoPool(): Object 0x4abb80 of class NSCFString
>>> autoreleased with no pool in place - just leaking
>>> Stack: (0x62a6bf 0x58be62 0x5d8b1c 0x5e2f24 0x5e2ee8 0x8ef58ce
>>> 0x8ef5bdc 0x8ef4d3c 0x4dd0490 0xca9d 0x1568d4 0x18fd8b 0x1c43c6
>>> 0x1eea08 0x96926f39 0x96926dbe)
>>> 2009-10-12 00:10:57.981 TouchClient[79105:4a03] ***
>>> _NSAutoreleaseNoPool(): Object 0x495dab0 of class NSCFString
>>> autoreleased with no pool in place - just leaking
>>> Stack: (0x62a6bf 0x58be62 0x6866e4 0x6126b9 0x5e2fda 0x5e2ee8
>>> 0x8ef58ce 0x8ef5bdc 0x8ef4d3c 0x4dd0490 0xca9d 0x1568d4 0x18fd8b
>>> 0x1c43c6 0x1eea08 0x96926f39 0x96926dbe)
>>>
>>> It's very simple code, basically retreiving some images. I tried
>>> null-ing out the allocated objects to see if that helped.
>>>
>>> public void CacheImage(string image_url,
>>> CacheImageCallback
>>> callback) {
>>> string file_path =
>>> GetPathForImageUrl(image_url);
>>>
>>> Thread thread = new Thread(new
>>> ThreadStart(delegate() {
>>> NSData data = null;
>>> NSUrl url = null;
>>> if (!File.Exists(file_path)) {
>>> url =
>>> NSUrl.FromString(image_url);
>>> data = NSData.FromUrl(url);
>>> if (data != null) {
>>> NSError err = null;
>>> if
>>> (data.Save(file_path,
>>> false, out err)) {
>>>
>>> Logger.Info("Image
>>> " + image_url + " saved to " + file_path);
>>> if
>>> (callback !=
>>> null) callback(image_url);
>>> }
>>> else {
>>> }
>>> }
>>> }
>>> else {
>>> if (callback != null)
>>> callback(image_url);
>>> }
>>> data = null;
>>> url = null;
>>> }));
>>> thread.IsBackground = true;
>>> thread.Start();
>>>
>>> }
>>> _______________________________________________
>>> MonoTouch mailing list
>>> MonoTouch at lists.ximian.com
>>> http://lists.ximian.com/mailman/listinfo/monotouch
>>
>>
> _______________________________________________
> MonoTouch mailing list
> MonoTouch at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/monotouch
More information about the MonoTouch
mailing list