加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 当NSArray元素被释放时会发生什么?

发布时间:2020-12-16 10:19:04 所属栏目:百科 来源:网络整理
导读:假设我创建了一些对象并将它们添加到数组中. House *myCrib = [House house];House *johnHome = [House house];House *lisaHome = [House house];House *whiteHouse = [House house];NSArray *houses = [NSArray arrayWithObjects: myCrib,johnHome,lisaHome
假设我创建了一些对象并将它们添加到数组中.

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对象的保留计数为2,但它们将被自动释放一次.过了一会儿,我决定释放myCrib,即使我不是主人 – 我从未保留或初始化.

[myCrib release];

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

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

谢谢.

解决方法

如果您不是所有者,则不应释放myCrib.这样做违反了内存管理准则,并且会使您的代码难以维护.我不能强调你绝对不应该在任何情况下这样做.你要求崩溃;数组已声明对象的所有权,并且您不得以任何方式破坏该所有权.

所以这里的答案是:你的代码绝对错误,你应该修复它.如果你无法修复它,你应该删除它并重新开始并继续重写它,直到你想出另一种方法来实现相同的效果而不破坏对象的所有权.我保证这是可能的.

如果您想要的是一个弱引用数组,那么有几种方法可以做到这一点(这个was just asked a couple of days ago):

> NSPointerArray – 弱引用其指针.当您使用垃圾收集时,它们会自动清零(即,在取消分配对象时,指针会被删除).不幸的是,这在iOS上不可用.
> CFMutableArrayRef – 您可以指定自定义保留和释放回调,或者根本不指定一个.如果将它们遗漏,数组将不会保留它包含的对象.但是,这不会自动删除指针.
> DDAutozeroingArray – 我前几天写的一个NSMutableArray子类,提供了一个适用于Mac OS和iOS的弱引用和自动调零数组.但是,我强烈建议您仅将此作为最后手段;做你正在寻找的东西可能有更好的方法. https://github.com/davedelong/Demos

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读