Objective c 当NSArray元素被释放时会发生什么?
假设我创建了几个对象,并将它们添加到数组中Objective c 当NSArray元素被释放时会发生什么?,objective-c,object,nsarray,null,foundation,Objective C,Object,Nsarray,Null,Foundation,假设我创建了几个对象,并将它们添加到数组中 House *myCrib = [House house]; House *johnHome = [House house]; House *lisaHome = [House house]; House *whiteHouse = [House house]; NSArray *houses = [NSArray arrayWithObjects: myCrib, johnHome, lisaHome, whiteHouse, nil]; 通常,
House *myCrib = [House house];
House *johnHome = [House house];
House *lisaHome = [House house];
House *whiteHouse = [House house];
NSArray *houses = [NSArray arrayWithObjects: myCrib, johnHome, lisaHome, whiteHouse, nil];
通常,所有房屋对象的保留计数为2,但它们将自动删除一次。过了一段时间,我决定释放myCrib
,即使我不是所有者——我从未保留或初始化过
[myCrib release];
保留计数应降至零,并且应解除分配我的对象。我现在的问题是:这个非法操作会不会导致我的应用程序工作错误甚至崩溃,或者将NSArray
简单地从其列表中删除我的对象,并产生不良后果
我正在寻找一种维护对象列表的方法,但我希望列表能够自我维护。当某个对象消失时,我希望对它的引用从数组中优雅而自动地消失。我正在考虑子类化或包装NSArray
多谢各位
我现在的问题是:这是否违法
操作导致我的应用程序工作
错误地,甚至崩溃,或将
NSArray只是从中删除我的对象
它的清单带来了不良后果
您的数组现在有一个无效的对象指针。仅仅通过查看指针无法判断指针是否无效,并且不会通知数组对象已被释放。问题不在于数组,毕竟,问题在于错误释放对象的代码。因此,是的,应用程序可能会由于错误的指针而崩溃或表现不正确,而不是,NSArray不会为您检测和处理该问题
我正在寻找一种方法来保持
对象列表,但我想要列表
为了维持自己。当某个物体
消失了,我想要它的参考
优雅地从我的阵型中消失
而且是自动的
如果列表中的对象都是公共类的实例,则可以定义自己的内存管理方法,这些方法既可以保留/释放对象,也可以从列表中添加/删除对象,或者在可能存在多个列表的情况下广播适当的通知。我想你甚至可以为了这个目的覆盖-保留和-释放,但我会在做之前仔细考虑,如果你这样做的话,会很好地记录下来;这不是其他开发人员所期望的
另一个选择可能是核心数据。如果从对象图中删除托管对象,它将从任何关系中消失。严格地说,一对多的关系是一个集合,而不是一个列表,但是对于你的目的来说,差异可能不是一个问题
更新:我刚注意到你没有在ios上标记你的问题。如果你在MacOS X下工作,你肯定应该看看。如果使用垃圾收集,可以将NSPointerArray配置为使用弱引用,并将对收集对象的引用替换为空引用。这正是您想要的。您要求的是在这里撞车。您的
NSArray
仍将有一个对现在不再存在的对象的引用——谁知道过一会儿它将指向什么
子类化NSArray
也可能不是答案。它是一个类集群,简而言之,这意味着子类化比您希望的要困难
不完全确定您将如何实现这一点。类似于元素在它们即将被释放时发送通知,然后数组将接收该通知。您需要小心不要泄漏或过度释放物品。如果您不是物品的所有者,您应该不要释放
myCrib
。这样做违反了内存管理准则,会使代码极难维护。我再怎么强调也不过分,你绝对不应该在任何情况下这样做。你是在要求崩溃;数组已声明对象的所有权,您不能以任何方式破坏该所有权
所以这里的答案是:你的代码是绝对错误的,你应该修正它。如果你不能修复它,你应该扔掉它,重新开始,继续重写它,直到你想出了另一种方法来实现同样的效果,而不破坏对象所有权。我保证这是可能的
如果您想要的是弱引用数组,那么有几种方法可以做到这一点:
NSPointerArray
-弱引用其指针。当您使用垃圾收集时,它们是自动归零的(即,当对象被解除分配时,指针被删除)。不幸的是,这在iOS上不可用CFMutableArrayRef
-您可以指定一个自定义的retain
和release
回调,或者干脆不指定一个回调。如果不使用它们,数组将不会保留它包含的对象。但是,当对象被解除分配时,这不会自动删除指针DDAutozeroingArray
-前几天我编写了一个NSMutableArray
子类,它提供了一个弱引用和自动归零数组,可在Mac OS和iOS上运行。但是,我强烈地鼓励您将此作为最后手段;也许有更好的方法来做你想做的事情李>
我正在寻找一种方法来保持
对象列表,但我想要列表
为了维持自己。当某个物体
消失了,我想要它的参考
优雅地从我的阵型中消失
而且是自动的。我在想
子类化或包装NSArray
如果我理解正确的话,您需要的是一组弱引用。然后,您可能会对阅读感兴趣。我创建了一个包装类,在我的代码中称为控制器,它为我维护(可变)数组。我在视图控制器(我需要它们的地方)中初始化控制器类,而不是直接使用数组 不在