2009-08-26 29 views
2

我正在清理我的电话簿iPhone应用程序中的代码和仪器中的泄漏工具报告,我泄漏NSCFString对象。下面是我下面的模式:Objective C NSCFString泄漏与NSMutableArrays

我在我的应用程序中的Person类有什么比当地的NSString成员和名字关联的属性更多,姓氏等

我的看法控制器有一个从searchBarSearchButtonClicked事件中的SQLite数据库填充的NSMutableArray属性。这个NSMutableArray填充了将用于填充我的tableview控件的Person对象。另外,如果用户点击视图中的某个人,他们的Person对象将被传递给Detail视图,以查看其他信息而不仅仅是名称。

当我执行第一次查找并显示结果时,没有内存泄漏。

现在,当我执行第二次查找时,我希望清除NSMutableArray并重新装入新的结果集而不会泄漏内存。因此,要做到这一点,我呼吁我的personList财产removeAllObjects,然后调用数据库重新填充personList NSMutableArray中,如下图所示:

[self.personList removeAllObjects]; 
self.personList = [SearchService GetPersonList:searchText]; 
[list reloadData]; 

通过调用removeAllObject我已经摆脱了,我曾经有过泄漏与Person对象关联。但是,现在我正在泄漏单个Person对象的属性中剩余的NSString对象。

这可能吗?

我是仪器工具的新手,但从扩展细节中可以看出,当我钻入NCSFString泄漏之一时,堆栈中的最后一行代码常常指向@synthesize代码行财产,如:

@synthesize firstName; 

所以,这就是为什么我认为这些NSStrings没有得到清理。有没有更好的方式来做到这一点,不会产生内存泄漏?

+0

如果您可以发布您的Person类的代码,可能更容易诊断正在发生的事情。 – Mark 2009-08-26 15:25:07

回答

3

您是否在您的Person类的dealloc方法中发布NSString s?

假设你设置你的财产像这样:

@property (retain) NSString *firstName; 

当使用二传手设定firstName,它将会被保留。如果Person实例随后被释放并释放,但firstName尚未释放,则会泄漏。

把它放在dealloc方法在Person类:

- (void)dealloc 
{ 
    [firstName release]; 
    [super dealloc]; 
} 

(假设用于您firstName属性对应的伊娃被称为firstName)。

+0

这似乎工作。但是,XCode 3.2.1中的代码分析器在dealloc方法中对我的发行版进行了评论:“调用者此时不拥有引用计数的不正确递减”。想法? – rtemp 2009-10-21 00:50:01

+0

代码分析器考虑在'-dealloc'中使用访问器方法,并警告你这一点 - 关于在init和dealloc中使用访问器是否有效这个问题存在争议,但我认为普遍的共识是引导清除并直接访问ivars(抱歉应该在之前指出)。 – 2009-10-21 05:59:13

+0

这对我来说虽然我的属性设置是:@property(nonatomic,assign)NSString * name; – 2015-07-26 18:51:15