2010-08-30 89 views
0

我的印象是,添加一個子視圖視圖是這樣下:Objective-C的addSubView保留計數

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
sitesel.view.frame = CGRectMake(0,0,100,100); 
[self.left addSubview:sitesel.view]; 
[sitesel release]; 

但好像我不應該放開sitesel(控制器)? 因此,我應該釋放視圖或什麼,我有這個保留的東西釘了一會兒,但它滑倒。 (和使用的TableView,你有子類的UITableViewController吧?)

(self.left是self.view的子視圖,在筆尖添加)

回答

1

addSubview確實能保留的觀點,這不是問題。你的問題是視圖的控制器稍後會消失。

您不應該發佈視圖,因爲這不關你的事。你沒有創造它,你沒有觸及它。不要管它。

爲了保持正常工作,它需要保持連接到一個有效的控制器。因此,您不得釋放控制器,但請保持它。在釋放控制器之前添加一個屬性,如@property(retain) UITableViewController *siteController;,然後執行self.siteController = sitesel;。這樣一切都留在記憶中。 PS:爲了保持清潔,您應該更改sitesel的訪問器中的視圖。只是爲了確保它總是來控制器。然後,您的方法會變得更短,只需設置控制器即可。

新增:這二傳手能像她那樣,要求您僅設置控制器和視圖被透明的更新:然後

- (void)setSiteselController:(UITableViewController *)ctrl { 
    if (_sitesel) 
    [_sitesel.view removeFromSuperview]; 

    [_sitesel autorelease]; 
    _sitesel = [ctrl retain]; 

    if (_sitesel) { 
    _sitesel.view.frame = CGRectMake(0,0,100,100); 
    [self.left addSubview: _sitesel.view]; 
    } 
} 

您的原始代碼將收縮到這麼多的清潔版本:

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle: UITableViewStyleGrouped]; 
self.siteselController = sitesel; 
[sitesel release]; 

PPS:你不需要需要 UITableView工作的控制器。這簡單得多!

+0

對不起,你可以擴展你的PS,我不太明白。但是我不需要再次訪問UITableViewController,從這一點開始的所有事情都是在TableViewController中完成的。 – 2010-08-30 13:41:05

+0

您應該重寫訪問器並在其中添加視圖。像這樣:'_controller = newController; _controller.view.frame = ... [self.view addSubview:_controller.view];' 你不需要控制器在這裏並不重要。如果你不這樣做,你必須保留它。你也許可能想在稍後刪除/交換該視圖。然後,爲了不浪費內存,瞭解控制器是很好的。 – 2010-08-30 13:48:09

+0

對不起,我還是不明白,我沒有看到你剛剛發佈的代碼有任何不同。 – 2010-08-30 20:41:40