我有一个包含许多对象的 NSMutableArray。
如果在我使用 [NSMutableArray array With Array:some Array] 复制数组时对数组进行更改,会发生什么情况?
例如:如果在复制时从数组中删除一个对象?
我不确定如何测试这个场景。
编辑:对象不会被释放(因为它们被保留在别处)。我只是使用这个数组作为查找表。
如您所知,不能保证容器/集合是线程安全的。什么could如果在复制或读取时更改数组会发生什么情况?很多东西。明显的情况是,它可能当时正在重新分配,它可能会传递或返回一个无效的引用给您(例如最近删除的引用),或者它可能会访问已释放的对象(从另一个线程)。除了会使您的应用程序崩溃或导致其他 UB 的情况外,它可能不会返回正确或一致的值。这是对数据的误解。两者都不好。
你不test场景 - 线程问题很难重现,并且您实际上永远无法涵盖所有情况。因为对象本身不能保证线程安全 - 您的实现必须一次限制对一个线程的访问/突变/交互。当处理多线程上下文中使用的对象时:每当您访问或查询对象的可变状态的信息时,您都应该保护该对象(例如使用锁)。因此,您只需在使用时将其锁定即可。锁定/复制/解锁/使用副本也很常见。对于 NSMutableArray,可变状态的示例是其所有对象及其计数。它的操作和突变也使用对象的可变状态,因此它们受到限制。
如果您仅从一个线程使用该对象,那么显然不需要锁定它。这也是为什么在大多数情况下传递副本和保存不可变变体都是好主意的原因。您不需要为每个对象都加一个锁,为持有该对象的对象设置一个保护通常是设计线程安全类的好方法。
Update
...会发生什么?副本是否包含所有 5 个对象(因为它们无论如何都保留在其他地方?它们包含 4 个吗?(甚至包含 4 个对我来说就足够了)是否抛出异常?
如果你没有正确地保护集合,那么它就像未定义的行为一样,如果它崩溃了,那你就很幸运了。
您需要采取适当的预防措施来避免未定义的行为。当你的程序没有得到适当的保护时,它就在该域中运行。
详细说明一下:将对象保留在外部只会减少未定义行为的可能性,但肯定不会消除它。后果的更多示例包括异常、段错误、读取或写入用作另一个活动分配的内存(这可能会显示为非常神秘的问题,实际上也可能无法重现)。
我鼓励你适当防范或采取其他方法。 UB 是邪恶的:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)