Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 询问对象是否无效_Iphone_Objective C_Memory Management - Fatal编程技术网

Iphone 询问对象是否无效

Iphone 询问对象是否无效,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我试图确定一个对象是否有效。该程序有(至少)两个线程,其中一个线程可能通过从NSMutableArray中删除该对象而使其无效。我需要另一个线程在对其进行操作之前检查其存在性或有效性 你说呢 我需要另一个线程在对其进行操作之前检查其存在性或有效性 最简单的方法是保留NSMutableArray中对象的索引,然后执行以下操作 if( myObject == [myArray objectAtIndex: myObjectIndex] ) { // everything is good !

我试图确定一个对象是否有效。该程序有(至少)两个线程,其中一个线程可能通过从NSMutableArray中删除该对象而使其无效。我需要另一个线程在对其进行操作之前检查其存在性或有效性

你说呢

我需要另一个线程在对其进行操作之前检查其存在性或有效性

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

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

   // everything is good !
}
else {
   // my object is not what I think it is anymore
}
然而,这种方法存在明显的问题

  • 插入、删除都会让你吃饱
  • 这种方法不是线程安全的,因为在读取数组时可以更改数组
  • 我真的建议使用不同的方式在两个线程之间共享这个数组。它必须是可变的吗?如果不能,那么就将其设置为不可变,这样就不必再担心线程问题。 如果是这样,那么你真的必须重新考虑你的方法。希望有人能以线程安全的方式提供一种cocoa方法,因为我没有这种经验。

    你说

    我需要另一个线程在对其进行操作之前检查其存在性或有效性

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

    if( myObject == [myArray objectAtIndex: myObjectIndex] ) {
    
       // everything is good !
    }
    else {
       // my object is not what I think it is anymore
    }
    
    然而,这种方法存在明显的问题

  • 插入、删除都会让你吃饱
  • 这种方法不是线程安全的,因为在读取数组时可以更改数组
  • 我真的建议使用不同的方式在两个线程之间共享这个数组。它必须是可变的吗?如果不能,那么就将其设置为不可变,这样就不必再担心线程问题。
    如果是这样,那么你真的必须重新考虑你的方法。希望有人能以线程安全的方式提供一种cocoa方法,因为我没有这种经验。

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

    任何时候,当您持有对将来可能使用的对象的引用时,必须保留它。如果没有,则表示您对该对象没有任何兴趣或所有权,系统可能随时将其丢弃


    使用objective C访问器和属性,而不是直接设置IVAR和使用retain/release,可以在很大程度上简化正确的操作。

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

    任何时候,当您持有对将来可能使用的对象的引用时,必须保留它。如果没有,则表示您对该对象没有任何兴趣或所有权,系统可能随时将其丢弃


    使用objective C访问器和属性,而不是直接设置IVAR和使用retain/release,可以大大简化正确的操作。

    多线程编程很难。难并不能说明它有多难。这是一种普通的,可用的,“合理限定”的方法是将两个不同的数字加在一起,这两个数字在有限的时间内被多个线程变异和共享,而无需使用CPU以原子指令形式提供的任何特殊帮助,这将是一个重大突破,也是您的博士论文。你选择的神会公开感谢你对人类的贡献。只是为了把两个数字相加。实际上,多线程编程甚至比这更难


    请看:。它概括地介绍了这个主题,并概述了等待您的一些不明显的陷阱。

    多线程编程很难。难并不能说明它有多难。这是一种普通的,可用的,“合理限定”的方法是将两个不同的数字加在一起,这两个数字在有限的时间内被多个线程变异和共享,而无需使用CPU以原子指令形式提供的任何特殊帮助,这将是一个重大突破,也是您的博士论文。你选择的神会公开感谢你对人类的贡献。只是为了把两个数字相加。实际上,多线程编程甚至比这更难


    请看:。它概括地介绍了这个主题,并概述了等待您的一些不明显的陷阱。

    这完全是非线程安全的。在检查指针和取消引用指针之间,它可能会被删除,而且它可能会在数组调用中崩溃,因为NSArray在内部不是线程安全的,在读取它时从一个线程对它进行变异可能会导致崩溃。我同意你的评论,我会把它添加到我的回答中。我想知道询问它是否无效与询问它是否有效是否有区别。也许我想得太深了?这完全是非线程安全的。在检查指针和取消引用指针之间,它可能会被删除,而且它可能会在数组调用中崩溃,因为NSArray在内部不是线程安全的,在读取它时从一个线程对它进行变异可能会导致崩溃。我同意你的评论,我会把它添加到我的回答中。我想知道询问它是否无效与a是否有区别