当NSArray元素被释放时会发生什么?

Con*_*has 3 null object objective-c foundation nsarray

假设我创建了一些对象并将它们添加到数组中.

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];
Run Code Online (Sandbox Code Playgroud)

通常,所有House对象的保留计数为2,但它们将被自动释放一次.过了一会儿,我决定释放myCrib,即使我不是主人 - 我从未保留或初始化.

[myCrib release];
Run Code Online (Sandbox Code Playgroud)

保留计数应该降为零,我的对象应该被释放.我现在的问题是:这种非法行为会导致我的应用程序错误地工作甚至崩溃,或者NSArray只是将我的对象从列表中删除而后果不好.

我正在寻找一种维护对象列表的方法,但我希望列表能够自我维护.当某个对象消失时,我希望它的引用能够优雅地自动地从我的数组中消失.我正在考虑子类化或包装NSArray.

谢谢.

Cal*_*leb 6

我现在的问题是:这种非法行为会导致我的应用程序错误地工作甚至崩溃,或者NSArray会简单地从列表中删除我的对象,结果不好.

您的数组现在有一个无效的对象指针.只是通过查看它就无法判断指针是无效的,并且不会通知数组该对象已被释放.问题不在于数组,毕竟问题在于代码不正确地释放了对象.所以是的,应用程序可能会因为错误的指针而崩溃或行为不正确,并且不会,NSArray不会检测并为您处理问题.

我正在寻找一种维护对象列表的方法,但我希望列表能够自我维护.当某个对象消失时,我希望它的引用能够优雅地自动地从我的数组中消失.

如果列表中的对象都是公共类的实例,则可以定义自己的内存管理方法,这些方法既保留/释放对象,又从列表中添加/删除对象,或者在可以有多个列表的情况下广播适当的通知.我想你甚至可以为这个目的覆盖-retain和-release,但是在做这件事之前我会考虑很久很难,如果你做的话就记录好了; 这不是其他开发人员所期望的那种.

另一种选择可能是核心数据.如果从对象图中删除托管对象,它将从任何关系中消失.严格来说,多对多关系是一个集合,而不是列表,但差异可能不是您的目的所关注的.

更新:我刚注意到你没有标记你的问题ios.如果你在MacOS X下工作,你一定要看看NSPointerArray.如果使用垃圾收集,则可以将NSPointerArray配置为使用弱引用并使用空引用替换对收集的对象的引用.这正是您所寻找的.