@property不保留

时间:2011-06-01 00:58:58

标签: objective-c cocoa-touch nsarray

我在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;

3 个答案:

答案 0 :(得分:4)

'results'和'array'是两个不同的数组。您可能会保留“结果”,但为什么会影响“数组”的保留计数?

至于你的崩溃,请检查你是否没有发布'结果'(它已经自动释放),并检查你是否正在使用合成的setData :(或者你编写了自己的setData:实际上保留了数据)< / p>

答案 1 :(得分:2)

此外,您通常不应使用retainCount方法进行内存管理。我不完全理解为什么,但如果你想深入挖掘这个问题可能会有所帮助:

When to use -retainCount?

只需使用XCode的Build and Analyze和Leaks工具来摆脱内存错误。不要过多地使用保留计数等。

答案 2 :(得分:2)

您几乎不应该尝试了解保留计数。你最终会感到困惑。

真正重要的是你保留了一个对象,就像你保留它一样多次。您确定setData:是保留财产吗?它是合成的还是定制的?你可以发布吗?

您输出的保留计数为array,但您已将results传递给setData:。那些是不同的对象。如果你真的想检查保留计数(你可能不应该这样做),你应该检查results的计数。

filteredArrayUsingPredicate:返回一个自动释放的对象(你可以说,因为方法名称不是以“alloc”,“new”,“copy”或“mutableCopy”开头 - 请参阅The Docs了解更多信息)。所以你一定要保留它,如果setData:确实是一个retain属性,那么这段代码应该可以正常工作。