如何解决@财产未保留
| 我在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 举报,一经查实,本站将立刻删除。