2011-06-30 67 views
1

請檢查我的關於這兩個UIPopoverController和loadViewControllerUIPopoverController和內容的ViewController - 內存管理的問題


- (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]; 
} 

的發行方式正如你可以看到我發佈loadViewController兩次,代碼工作,無泄漏,但我有一些疑問。 如果我釋放一次,則不會在loadViewController中調用dealloc。

回答

1

如果您loadPopover屬性是保留/複印,下面一行是過保留對象和泄漏:

self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController]; 

兩個,分配-init和屬性訪問保留的對象。這應該是:

self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease]; 

這就是爲什麼loadPopover對象,如果你把它兩個釋放的消息只被釋放,但你永遠不應該訴諸這些技巧

編輯:

你也有另外一個內存管理問題。您正在釋放你不要在這行擁有的對象:

[popoverController.contentViewController release]; 

這是popoverController責任保留/釋放contentViewController。通過這樣做你是過度釋放contentViewController

綜上所述,你的代碼應該是這樣的:

- (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; 
} 
+0

...或'loadPopover = [[UIPopoverController頁頭] initWithContentViewController:loadViewController]'+1爲正確答案 – Till

+0

可能仍是更好地根據最初的例子,分配作爲伊娃的_loadPopover; loadPopover符號應該留給訪問者(setLoadPopover:和loadPopover:) – viggio24

+0

@ viggio24你是否建議不要在課堂上使用該屬性?因爲我不同意,屬性封裝了內存管理代碼,從而減少了樣板。如果您直接指定後援ivar'_loadPopover',則必須確保釋放其先前的值。 – albertamg