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
Post a Comment