我有一个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];
我没有使用自定义设置器。发生了什么事?
答案 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。
有:
那么你的代码就是:
self.data = s;
[s release];
要调试的两件事:
使用静态分析 - 我个人发现此工具在保留/发布问题上100%准确:http://clang.llvm.org/StaticAnalysisUsage.html
按照我在博客上关于iPhone上内存调试的说明进行操作:
http://loufranco.com/blog/files/debugging-memory-iphone.html
答案 3 :(得分:0)
如果数据肯定是没有相同名称的基础值的属性,则必须从self
或[[self data] release]
中[self.data release]
访问该数据。但是如上所述,如果属性设置为自动保留,则可以通过将属性设置为新值(例如nil
)来完成相同的操作。 (正如你在你注意到的代码中所做的那样工作。)