2012-07-13 71 views
2

我動態地將子視圖添加到另一個uiview;self removeFromSuperView不釋放自我?

在子視圖,單擊一個按鈕通過下面的方法來回去:

[self removeFromSuperView ]; 

但經過曼尼次添加子視圖,並刪除它,我的應用程序可能會崩潰,日誌說,被殺害了。

我發現撥打[self removeFromSuperView]沒有釋放自我。那麼釋放它的最好方法是什麼?

+1

後它增加了子視圖到parentview的代碼。 – Apurv 2012-07-13 05:49:22

+0

發佈一些代碼,所以我們可以理解 – Hiren 2012-07-13 06:14:38

回答

4

如果您在創建時保留UIView(或將其添加到數組中),則保留計數將增加。例如:

// Retain count is 1 
UIView *myView = [[UIView alloc] initWithFrame:myFrame]; 

// Retain count is 2 
[myParentView addSubview:myView]; 

// Retain count is 1 again 
[myView removeFromSuperView]; 

在上面的例子中,你可以autorelease視圖如果立即添加作爲一個子視圖或釋放它在你的dealloc如果它是伊娃。

編輯:(其他原因,你的觀點可以保留)

// Retain count +1 
[myArray addObject:myView]; 

// Retained in the setter created by the @synthesize directive 
@property(nonatomic, retain) UIView *myView; 

中還有其他屬性保留在文件中,指出。

如果確實要釋放它們,您還應該小心在VC的loadView方法中創建對象,因爲它們將在調用loadView時再次創建。如果您的VC視圖已卸載然後重新加載,則會發生這種情況。

+0

我添加子視圖是這樣的: UIView * myView = [[UIView alloc] initWithFrame:myFrame]; [myParentView addSubview:myView];並且在add.because之後不會釋放,當我調用[self removeFromSuperView]時,應用程序有時會崩潰; – 2012-07-14 08:07:16

+0

嗨xxhp,應用程序將崩潰,如果你創建它(保留1),addSubview(保留2),釋放視圖(保留1),從超視圖中刪除(版本0,查看dealloc'd)。 addSubview(崩潰)。聽起來就像你需要使用一個iVar並創建你的視圖,並在你的VC的dealloc中釋放它,如果你想讓它堅持下去,所以你可以添加和刪除superView。如果是這種情況,那麼視圖不會被解除分配,直到你的VC也被解除分配。同樣,你可以在loadView中創建它,並在viewDidUnload中釋放它。希望這有助於,戴夫 – 2012-07-14 09:41:30

+0

謝謝。我會試試這個。 – 2012-07-15 01:17:16

0

看起來像是將保留視圖添加爲子視圖。其父母的觀點再次保留下來。 所以當你的單元[self removeFromSuperView];它從superView獲得釋放消息,但仍然必須由創建者釋放。

2

你應該首先發布。 「alloc」的對應部分是「釋放」,「addSubview」的對應部分是「removeFromSuperView」:保持這些平衡。

add視圖:

UIView *myView = [[UIView alloc] initWithFrame:myFrame]; 
[myParentView addSubview:myView]; 
[myView release]; 

移除View(視圖將在存儲器removeFromSuperView後清理):

[myView removeFromSuperView]; 
+0

我試過這個,但是app有時會崩潰! – 2012-07-14 08:13:31

相關問題