我在iOS編程方面相當新穎,而且我正在開發一款iPad應用程序時遇到問題。 我每次使用splitview控制器都會在splitview的rootview中的單元格被點擊時向splitview的detailview添加子視圖。這很好,直到堆棧變得太高而且內存不足。如何在新視圖添加到堆棧後釋放前一個子視圖? 或者有沒有更好的方法來解決這個問題?發佈子視圖
感謝
我在iOS編程方面相當新穎,而且我正在開發一款iPad應用程序時遇到問題。 我每次使用splitview控制器都會在splitview的rootview中的單元格被點擊時向splitview的detailview添加子視圖。這很好,直到堆棧變得太高而且內存不足。如何在新視圖添加到堆棧後釋放前一個子視圖? 或者有沒有更好的方法來解決這個問題?發佈子視圖
感謝
要從它的父刪除視圖:
[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示例一樣處理視圖,可能只是爲了保存一行代碼並將內存管理隱式地進行更改。