2009-07-19 33 views
0

我想確定對象是否有效。該程序有(至少)兩個線程,其中一個線程可能會通過從NSMutableArray中移除對象來使對象無效。我需要另一個線程來檢查它的存在或有效性,然後再對其進行處理。詢問對象是否無效

回答

1

多線程編程很難。困難並沒有開始捕捉它有多困難。這是一種困難,在這種困難中,一種通用的,可用的,合理限定的方式確定性地將兩個不同的數字加在一起,這些數字在有限時間內由多個線程進行變異和共享,而不需要CPU中的任何特殊幫助的原子指令將是您博士學位的重大突破和主題。你選擇的神只會公開感謝你對人類的貢獻。只是爲了將兩個數字加在一起。實際上,多線程編程比這更難。

看一看:Technical Note TN2059 Using collection classes safely with multithreaded applications。它一般涵蓋了這個話題,並概述了一些等待你的非顯而易見的陷阱。

0

你說

我需要另一個線程行動前,要檢查其要麼存在或效力。

最簡單的方法就是持續在的NSMutableArray對象的索引,然後就

if(myObject == [myArray objectAtIndex: myObjectIndex]) { 

    // everything is good ! 
} 
else { 
    // my object is not what I think it is anymore 
} 

有明確的問題,這種做法不過

  1. 插入以下,並刪除會填滿你
  2. 該方法是不是線程安全的,因爲該數組可以改變,而你正在閱讀它

我真的推薦使用不同的方式在兩個線程之間共享這個數組。它是否必須是可變的?如果它不能讓它變得不可變,那麼你就不必擔心線程問題了。如果是這樣,那麼你真的不得不重新考慮你的方法。希望有人能以線程安全的方式提供可可方法,因爲我沒有經驗。

+0

這完全沒有線程安全。在檢查指針和取消引用之間,它可能會被刪除,並且它可能會在數組調用內部崩潰,因爲NSArray不是內部線程安全的,並且在讀取它時從一個線程中突變它可能會導致崩潰。 – 2009-07-20 00:14:05

+0

我同意你的評論,我會將其添加到我的答案 – hhafez 2009-07-20 00:23:52

2

你不能。檢查對象指針是否仍然表示有效對象的唯一方法是取消引用它,但取消引用「無效」對象(我假定您指的是已經處理的對象)將導致訪問在同一位置分配的新對象,可能與普通對象相同或不相同的垃圾數據,或導致立即執行EXEC_BAD_ACCESS的未映射內存頁面。

無論何時您持有對將來可能使用的對象的引用,您都必須保留它。如果你沒有,你沒有表現出任何興趣或所有權的對象和系統可能會在任何時候扔掉它。

使用客觀的C訪問器和屬性,而不是直接設置ivars,並使用保留/發佈簡化了相當多的事情。