0

我在iOS編程方面相當新穎,而且我正在開發一款iPad應用程序時遇到問題。 我每次使用splitview控制器都會在splitview的rootview中的單元格被點擊時向splitview的detailview添加子視圖。這很好,直到堆棧變得太高而且內存不足。如何在新視圖添加到堆棧後釋放前一個子視圖? 或者有沒有更好的方法來解決這個問題?發佈子視圖

感謝

回答

0

要從它的父刪除視圖:

[view removeFromSuperview]; 

的上海華將發佈在這一點上的看法。所以如果superview是擁有引用的唯一actor,那麼視圖將被釋放。換句話說,這個:

[superview addSubview:view]; 

導致superview保留視圖。所以,你經常看到這樣的代碼塊:

view = [[ViewClass alloc] initWithFrame:frame]; // I own view 

[superview addSubview:view];     // superview and I both own view 

[view release];         // now only superview owns view; 
               // it'll be deallocated if 
               // superview ever relinquishes 
               // ownership 

所以,你現在有一個指針,以查看是否有效,只要認爲留在上海華。因此隨後可以安全地發佈removeFromSuperview,但之後視圖的使用明顯不安全。視圖對象只能在alloc/init和removeFromSuperview之間生存。它在被刪除後會被釋放。

每正常可可引用計數規則,以下是幾乎相同的下拉更換爲分配/ init和後續版本:

view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object; 
             // the autorelease pool owns it 

[superview addSubview:view];    // superview now owns view also 

// the autorelease pool will relinquish ownership automatically, in the future... 

如果您還沒有手動做任何事影響行爲,只是在正常的runloop中,那麼autorelease池中的事物對於當前調用堆棧的生命是安全的。在這種情況下,您應該像處理alloc/init示例一樣處理視圖,可能只是爲了保存一行代碼並將內存管理隱式地進行更改。