2010-04-07 47 views
1

我的應用程序中有幾個對象可以在某些時候變爲零,並且我有一些理論上用於將這些對象置零的方法。iphone - 測試對象是否存在

但是,如果我試圖放棄一個不存在的對象,應用程序將崩潰。

例如...

[object1 release]; 
object1 = nil; 

// ...,之後

[object1 removeFromSuperview]; // this will crash 

後來我想,爲什麼不測試,以查看是否刪除對象之前存在...

if (object1 != nil) 
[object1 removeFromSuperview]; 
// this will crash too, because object1 cannot be tested for nil because it does not exist 

如何在測試之前檢查對象是否存在,如果它爲零? 東西如

if (object1 exists({ 
    if(object1 != nil)) 
    [object1 removeFromSuperview) 
} 

這是可能的嗎?

我將此澄清......

我的意思是這樣的:想象我已經object1宣佈對頭部和代碼初始化。所以它存在並指向一個有效的參考。在某些時候,對象可能會被釋放,所以引用仍指向一個對象,但對象被釋放。即使我在釋放後將對象置於零,我也無法做任何事情。

問題是這樣的:我有一些異步的方法。其中一人掃描一些物體,如果發現它們就將其移除。我必須檢查對象是否存在,並且在再次釋放對象之前指向有效對象。這是關鍵:如何在釋放對象之前測試對象是否存在,並將其引用指向有效的對象,以便再次釋放已釋放的對象並使應用程序崩潰。

+0

你的意思是「object1」處處有「對象」嗎?我假設如此。 – itsmatt 2010-04-07 16:39:22

+0

我已經澄清了原來的問題。謝謝。 – SpaceDog 2010-04-07 16:51:52

+0

您正在混合使用術語指針,引用和對象。這些術語具有非常不同的含義。如果你不瞭解它們之間的差異,它會幫助你閱讀C編程。如果你確實瞭解它們,那麼如果你更加註意自己的用法,它會對你的讀者有所幫助。因爲這個,你的帖子有點難以閱讀。 – glorifiedHacker 2010-04-07 17:06:54

回答

7

總之,您確定指針是否仍然有效的問題正在走向錯誤的路徑。

釋放對象後,必須立即將其值設置爲null,以便不再控制它。如果兩個方法正在異步訪問同一個對象,那麼它們必須在那時同步,以便在另一個線程中發佈和設置爲null的同時發生在另一個線程有機會中斷之前。

+0

我已澄清原始問題。謝謝。 – SpaceDog 2010-04-07 16:51:11

2

你只是猜測,或者你真的嘗試過嗎?因爲在其他編程語言中,在nil上調用方法會導致崩潰。在Objective-C中,這不是真的。在Objective-C中,您可以將消息發送到零而不會導致崩潰。這些消息根本沒有效果。

事實上,你可真猥褻並執行以下操作不崩潰:

[(id)nil setTitle:@"Testing"]; // This will not cause a crash 

如果您的應用程序崩潰,這是不是因爲你是郵件爲零。但是,您可能無法將指針設置爲零,並且您正在傳遞內存中不屬於您的對象。考慮到您在更新中提供的細節,即您有一個異步線程訪問這些對象,我認爲您很可能將消息發送給其對象已被釋放但尚未設置爲零的指針。

+0

謝謝。我不是在猜測。我現在看到的問題不是針對nil進行測試,而是在測試之前測試引用的有效性。想象一下,指向已釋放視圖的引用。該引用是有效的,但它引用的對象不是。 – SpaceDog 2010-04-07 23:48:08

1

我比較了一個對象之前零沒有任何問題。

+0

謝謝。我現在看到的問題不是針對nil進行測試,而是在測試之前測試引用的有效性。想象一下,指向已釋放視圖的引用。該引用是有效的,但它引用的對象不是。無論如何感謝您的回答。努力幫助:-) +1 – SpaceDog 2010-04-07 23:49:17