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


    如果我理解正确的话,您需要的是一组弱引用。然后,您可能会对阅读感兴趣。

    我创建了一个包装类,在我的代码中称为控制器,它为我维护(可变)数组。我在视图控制器(我需要它们的地方)中初始化控制器类,而不是直接使用数组

    不在