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.
谢谢.
我现在的问题是:这种非法行为会导致我的应用程序错误地工作甚至崩溃,或者NSArray会简单地从列表中删除我的对象,结果不好.
您的数组现在有一个无效的对象指针.只是通过查看它就无法判断指针是无效的,并且不会通知数组该对象已被释放.问题不在于数组,毕竟问题在于代码不正确地释放了对象.所以是的,应用程序可能会因为错误的指针而崩溃或行为不正确,并且不会,NSArray不会检测并为您处理问题.
我正在寻找一种维护对象列表的方法,但我希望列表能够自我维护.当某个对象消失时,我希望它的引用能够优雅地自动地从我的数组中消失.
如果列表中的对象都是公共类的实例,则可以定义自己的内存管理方法,这些方法既保留/释放对象,又从列表中添加/删除对象,或者在可以有多个列表的情况下广播适当的通知.我想你甚至可以为这个目的覆盖-retain和-release,但是在做这件事之前我会考虑很久很难,如果你做的话就记录好了; 这不是其他开发人员所期望的那种.
另一种选择可能是核心数据.如果从对象图中删除托管对象,它将从任何关系中消失.严格来说,多对多关系是一个集合,而不是列表,但差异可能不是您的目的所关注的.
更新:我刚注意到你没有标记你的问题ios.如果你在MacOS X下工作,你一定要看看NSPointerArray.如果使用垃圾收集,则可以将NSPointerArray配置为使用弱引用并使用空引用替换对收集的对象的引用.这正是您所寻找的.
| 归档时间: |
|
| 查看次数: |
1019 次 |
| 最近记录: |