询问对象是否无效

时间:2009-07-19 23:52:51

标签: iphone objective-c memory-management

我正在尝试确定某个对象是否有效。该程序具有(至少)两个线程,其中一个线程可能通过从NSMutableArray中删除它来使该对象无效。我需要另一个线程来检查它的存在或有效性,然后再对其进行操作。

3 个答案:

答案 0 :(得分:2)

你做不到。检查对象指针仍然代表有效对象的内存的唯一方法是取消引用它,但解除引用“无效”对象(我假设你的意思是已被解除分配的对象)将导致访问内存已在同一位置分配的新对象,可能与正常对象相同或不同的垃圾数据,或者将导致立即执行EXEC_BAD_ACCESS的未映射内存页。

如果您持有对将来可能使用的对象的引用,则必须保留它。如果你不这样做,你没有在对象中表现出任何兴趣或所有权,系统可能随时将其丢弃。

使用目标C访问器和属性而不是直接设置ivars并使用retain / release简化了正确的操作。

答案 1 :(得分:1)

多线程编程很难。艰难并没有开始捕捉到它的难度。这是一种通用的,可用的,“合理限定”的方式,确定性地将两个不同的数字组合在一起,在有限的时间内由多个线程进行变异和共享,而不使用来自CPU的任何特殊帮助原子指令将是一个重大突破和博士论文。你选择的神灵会公开感谢你对人类的贡献。只是为了将两个数字加在一起。实际上,多线程编程比这更难。

看看:Technical Note TN2059 Using collection classes safely with multithreaded applications。它总体上涵盖了这个主题,并概述了一些等待你的非显而易见的陷阱。

答案 2 :(得分:0)

你说

  

在采取行动之前,我需要另一个线程来检查它的存在或有效性。

最简单的方法是保持NSMutableArray中对象的索引,然后执行以下操作

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

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

然而,这种方法存在明显的问题

  1. 插入和删除会让您满意
  2. 该方法不是线程安全的,因为在您阅读时可以更改阵列
  3. 我真的建议使用不同的方式在两个线程之间共享此数组。它必须是可变的吗?如果它没有,那么使它不可变,然后你不再需要担心线程问题。 如果确实如此,那么你真的必须重新考虑你的方法。希望有人能以线程安全的方式提供可可的方式,因为我没有经验。