2011-05-23 25 views
0

我有我的應用程序有問題,其中對於該代碼是太長了進入,但我只想當我取出一個UIView,並用一個新的像這樣替換它說:我如何正確丟棄子視圖?

NSLog(@" .. %@", (Icon *)[self viewWithTag:index]); 
Icon *icon = (Icon *)[self viewWithTag:index]; 
CGRect frame = icon.frame; 
int tag = icon.tag; 
[icon removeFromSuperview]; 
[icon release]; 

Icon *icon2 = [[Icon alloc] init]; 
icon2.frame = frame; 
[icon2 makeIconStandardWithTag:(int)tag]; 
[self addSubview:icon2]; 

它做了一些奇怪的事情,第一次NSLog(因爲視圖已經存在)顯示該對象是一個圖標,但運行此代碼後第二次顯示它是一個UIImageView出於某種原因,現在它顯示了我假定是屏幕上某個奇怪位置的原始圖標。這是非常不穩定的行爲。但我知道的是這樣的:

刪除[icon removeFromSuperview];行,儘管保持對象在那裏,停止這種行爲,並導致NSLog返回一個圖標,因爲它應該。

所以我的猜測是它不能正確刪除圖標。有沒有辦法完全刪除圖標,或者是我可以去的removeFromSuperview。我能做的只是將它設置爲alpha = 0,但這更多的是修補解決方案,而不是我想如何解決它。

回答

1

「有沒有辦法徹底清除 圖標,或者是removeFromSuperview據 我可以去」

您可以將對象設置爲nil:

icon = nil; 
+0

謝謝。雖然這還沒有解決我的問題(這個問題與將它從超級視圖中移除有關),這使我向前邁進了一步。 – Andrew 2011-05-23 18:59:58

+1

這只是防止你無意中發送消息給非零但釋放的對象。這在Garbage Collected環境中很有用,但不會在iOS上更快地發佈該對象。 – Abizern 2011-05-23 19:00:21

1

燦你在這行代碼中驗證「self」是什麼: 它可能不是你的想法。

[self addSubview:icon2]; 
    NSLog(@" Self is %@", self); 
+0

自我就是它的意圖。 (還是)感謝你的建議。 – Andrew 2011-05-23 19:09:27

0

這是一個猜測,但嘗試設置self.tag爲-1或不與你在你的Icon對象設置標籤碰撞的其他值。 viewWithTag:方法搜索當前視圖及其子視圖以進行匹配,因此如果self.tag == 0和您調用[self viewWithTag:0],則會得到self

+0

試過這個。還給每個子視圖一個-1的標籤,否則我敢肯定他們中的一個看起來是第一次使用viewwithtag。雖然也許第一個帶0的視圖是我的第一個圖標,但因爲第二個圖標是新的,所以其他東西等於0.很遺憾,我無法得到一切爲0的列表,我想我已經做了所有其他的事情a -1。 – Andrew 2011-05-23 19:37:58

0

在此之前你在某處保留過圖標嗎?如果沒有,在調用removeFromSuperview之後不需要釋放它。同樣,除非你需要在別處引用icon2,否則可以在調用addSubview之後釋放它。

視圖保留通過addSubview添加的視圖,它們釋放通過removeFromSuperview刪除的視圖。