Objective C NSCFString使用NSMutableArrays泄漏

时间:2009-08-26 15:21:21

标签: iphone objective-c xcode memory-leaks instruments

我正在使用电话簿iPhone应用程序清理我的代码,而且Instruments中的Leaks工具报告我正在泄漏NSCFString对象。以下是我所遵循的模式:

我的应用程序中有一个Person类,它只包含本地NSString成员以及名字,姓氏等相关属性。

我的视图控制器有一个NSMutableArray属性,该属性是从searchBarSearchButtonClicked事件中的SQLite数据库填充的。此NSMutableArray使用Person对象填充,该对象将用于填充我的tableview控件。此外,如果用户单击视图中的某个人,他们的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没有得到清理。有没有更好的方法来做到这不会产生内存泄漏?

1 个答案:

答案 0 :(得分:3)

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

假设你设置了你的财产:

@property (retain) NSString *firstName;

使用setter设置firstName时,它将被保留。如果Person实例随后被释放并取消分配,但firstName尚未释放,则会泄漏。

将其放入dealloc课程中的Person方法:

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

(假设用于firstName属性的相应ivar称为firstName)。