ios - UIPopoverController and content ViewController - memory management question -


please check approach concerning release of both uipopovercontroller , loadviewcontroller

 - (ibaction) managecardsets:(uibarbuttonitem*)baritem {     loadviewcontroller *loadviewcontroller = [[loadviewcontroller alloc] initwithstyle:uitableviewstyleplain];       self.loadpopover = [[uipopovercontroller alloc] initwithcontentviewcontroller:loadviewcontroller];     self.loadpopover.delegate = self;      [self.loadpopover presentpopoverfrombarbuttonitem:baritem permittedarrowdirections:uipopoverarrowdirectiondown animated:yes];         [loadviewcontroller release]; }  - (void)popovercontrollerdiddismisspopover:(uipopovercontroller *)popovercontroller {      [popovercontroller.contentviewcontroller release];     self.loadpopover = nil;     [_loadpopover release];  } 

as can see release loadviewcontroller twice , code works, no leaks, have doubts. if release once, dealloc not called in loadviewcontroller.

if loadpopover property retain/copy, following line over-retaining object , leaking:

self.loadpopover = [[uipopovercontroller alloc] initwithcontentviewcontroller:loadviewcontroller]; 

both, alloc-init , property accessor retain object. should be:

self.loadpopover = [[[uipopovercontroller alloc] initwithcontentviewcontroller:loadviewcontroller] autorelease]; 

this why loadpopover object gets deallocated if send 2 release messages you should never resort these tricks.

edit:

you have memory management problem. releasing object not own in line:

[popovercontroller.contentviewcontroller release]; 

it popovercontroller responsability retain/release contentviewcontroller. doing over-releasing contentviewcontroller.

to sum up, code this:

- (ibaction) managecardsets:(uibarbuttonitem*)baritem {     loadviewcontroller *loadviewcontroller = [[loadviewcontroller alloc] initwithstyle:uitableviewstyleplain];       self.loadpopover = [[[uipopovercontroller alloc] initwithcontentviewcontroller:loadviewcontroller] autorelease];     self.loadpopover.delegate = self;      [self.loadpopover presentpopoverfrombarbuttonitem:baritem permittedarrowdirections:uipopoverarrowdirectiondown animated:yes];         [loadviewcontroller release]; }  - (void)popovercontrollerdiddismisspopover:(uipopovercontroller *)popovercontroller {     self.loadpopover = nil; } 

Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -