我在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;
答案 0 :(得分:4)
'results'和'array'是两个不同的数组。您可能会保留“结果”,但为什么会影响“数组”的保留计数?
至于你的崩溃,请检查你是否没有发布'结果'(它已经自动释放),并检查你是否正在使用合成的setData :(或者你编写了自己的setData:实际上保留了数据)< / p>
答案 1 :(得分:2)
此外,您通常不应使用retainCount
方法进行内存管理。我不完全理解为什么,但如果你想深入挖掘这个问题可能会有所帮助:
只需使用XCode的Build and Analyze和Leaks工具来摆脱内存错误。不要过多地使用保留计数等。
答案 2 :(得分:2)
您几乎不应该尝试了解保留计数。你最终会感到困惑。
真正重要的是你保留了一个对象,就像你保留它一样多次。您确定setData:
是保留财产吗?它是合成的还是定制的?你可以发布吗?
您输出的保留计数为array
,但您已将results
传递给setData:
。那些是不同的对象。如果你真的想检查保留计数(你可能不应该这样做),你应该检查results
的计数。
filteredArrayUsingPredicate:
返回一个自动释放的对象(你可以说,因为方法名称不是以“alloc”,“new”,“copy”或“mutableCopy”开头 - 请参阅The Docs了解更多信息)。所以你一定要保留它,如果setData:
确实是一个retain属性,那么这段代码应该可以正常工作。