【问题标题】:@property not retaining@property 不保留
【发布时间】:2011-06-01 00:58:57
【问题描述】:

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

【问题讨论】:

  • data 属性是如何定义的? setData: 是如何定义的?
  • 粘贴您的 InventoryFilteredTVC 对象的 dealloc 代码。
  • 简答:不要调用retainCount

标签: objective-c cocoa-touch nsarray


【解决方案1】:

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

至于您的崩溃,请检查您是否没有发布“结果”(它已经自动发布),并检查您是否使用了合成的 setData:(或者您编写了自己的 setData:实际上保留了数据)

【讨论】:

    【解决方案2】:

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

    真正重要的是释放对象的次数与保留对象的次数一样多。您确定setData: 是保留属性吗?是合成的还是定制的?你能发帖吗?

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

    filteredArrayUsingPredicate: 返回一个自动释放的对象(你可以看出来,因为方法名称不是以“alloc”、“new”、“copy”或“mutableCopy”开头——更多信息请参见The Docs) .所以你绝对应该保留它,如果setData: 真的是一个保留属性,那么这段代码应该可以正常工作。

    【讨论】:

      【解决方案3】:

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

      When to use -retainCount?

      只需使用 XCode 的 Build and Analyze 和 Leaks 工具即可消除内存错误。不要对保留计数等过于关注。

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 2011-08-02
        • 2010-10-09
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 2011-07-30
        相关资源
        最近更新 更多