微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

@财产未保留

如何解决@财产未保留

| 我在InventoryFilteredTVC中有一个名为NSArray类型的数据的属性,这是示例代码
NSArray *results = [array filteredArrayUsingPredicate:predicate];
NSLog(@\"%i\",[array retainCount]);
InventoryFilteredTVC *filteredTVC = [[InventoryFilteredTVC alloc] initWithStyle:UITableViewStylePlain];
[filteredTVC setTitle:@\"Search Results\"];
[filteredTVC setData:results];
NSLog(@\"%i\",[array retainCount]);
返回:
1
1
这是为什么?为什么不保留数据?另外,当我尝试在InventoryFilteredTVC中的dealloc方法中取消分配数据时,会发生崩溃,这显然是因为未保留数据。我究竟做错了什么? 编辑:我的属性定义为
@property (nonatomic,retain) NSArray *data;
    

解决方法

        \'results \'和\'array \'是两个不同的数组。您可能保留了“结果”,但是为什么这会影响“数组”的保留数呢? 至于崩溃,请检查您是否没有释放\'results \'(它已经自动释放),并检查您是否使用了合成的setData :(或您编写了自己的setData:实际上保留了数据)     ,        另外,通常不应使用use3ѭ方法进行内存管理。我不完全理解为什么,但是如果您想在这里进行更深入的研究,这可能会有所帮助: 何时使用-retainCount? 只需使用XCode的Build and Analyze和Leaks工具即可消除内存错误。保留计数等不要让自己过多。     ,        您几乎永远不要尝试了解保留计数。您最终会感到困惑。 真正重要的是,您释放一个对象的次数与保留它的次数相同。您确定ѭ4是保留财产吗?它是合成的还是定制的?你可以张贴吗? 您正在输出count5ѭ的保留计数,但是您将
results
传递给
setData:
。这些是不同的对象。如果您确实要检查保留计数(您可能不应该检查),则应检查
results
filteredArrayUsingPredicate:
返回一个自动释放的对象(您可以知道,因为方法名不是以\“ alloc \”,\“ new \”,\“ copy \”或\“ mutableCopy \”开头的,请参见文档更多信息)。因此,您绝对应该保留它,并且如果
setData:
实际上是保留属性,则此代码应该可以正常工作。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。