我正在尝试确定某个对象是否有效。该程序具有(至少)两个线程,其中一个线程可能通过从NSMutableArray中删除它来使该对象无效。我需要另一个线程来检查它的存在或有效性,然后再对其进行操作。
答案 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
}
然而,这种方法存在明显的问题
我真的建议使用不同的方式在两个线程之间共享此数组。它必须是可变的吗?如果它没有,那么使它不可变,然后你不再需要担心线程问题。 如果确实如此,那么你真的必须重新考虑你的方法。希望有人能以线程安全的方式提供可可的方式,因为我没有经验。