什么时候使用自己?

时间:2009-03-14 14:54:21

标签: iphone objective-c

我有一个iPhone应用程序,其中一个视图,视图A,更新标签栏中的另一个视图,视图B,使用:

// This works.
- (void) reloadData
{
    MyDB * db = _GET_DB_CLASS;
    if(data != nil) // data is a property of type NSMutableArray
        [data release];

    NSMutableArray * d = [db getDataQuery];
    data = s; // Don't release since we are not using the accessor. And retain count should be 1.
}

如果我这样做,它就不起作用(例如我更新B,然后切换到B,崩溃。我在日志中看不到任何有用的东西......)。

    NSMutableArray * d = [db getDataQuery];
    self.data = s; // Doesn't work
    [data release];

我没有使用自定义设置器。发生了什么事?

4 个答案:

答案 0 :(得分:1)

我完全忘了这件事。太多的工作。所以我不确定问题的确切性质是什么。但我仔细研究了调试器中的retainCounts(在尝试Lou建议之前)。

这是保留/发布问题。我想规则是与你的用法一致。无论如何,这有效:

- (void) reloadFridgeData
{
    MyDB * db = _GET_DB_CLASS;
    if(self.data != nil)
    {
        self.data = nil;
    }

    NSMutableArray * newData = [db getData];
    self.data = newData;
    [newData release];
}

答案 1 :(得分:0)

您是否已声明您的数据属性为“保留”,而不是“分配”?你应该有类似的东西:

@property(retain)NSMutableArray * data;

如果没有,那么当您分配给data属性时,它不会增加引用计数。您的后续版本将释放该对象,并且对data属性的下一个引用将崩溃。

有关保留的更多信息,请查看Apple docs for setter semantics

答案 2 :(得分:0)

通常,如果您只是使用retain属性,则应始终使用self.data并调用生成的setter。

有:

  1. 自动调用旧值(检查为零)
  2. 呼叫保留新值
  3. 那么你的代码就是:

    self.data = s;
    [s release];
    

    要调试的两件事:

    1. 使用静态分析 - 我个人发现此工具在保留/发布问题上100%准确:http://clang.llvm.org/StaticAnalysisUsage.html

    2. 按照我在博客上关于iPhone上内存调试的说明进行操作:

    3. http://loufranco.com/blog/files/debugging-memory-iphone.html

答案 3 :(得分:0)

如果数据肯定是没有相同名称的基础值的属性,则必须从self[[self data] release][self.data release]访问该数据。但是如上所述,如果属性设置为自动保留,则可以通过将属性设置为新值(例如nil)来完成相同的操作。 (正如你在你注意到的代码中所做的那样工作。)