我正在使用电话簿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没有得到清理。有没有更好的方法来做到这不会产生内存泄漏?
答案 0 :(得分:3)
您是否在Person类的NSString
方法中发布了dealloc
?
假设你设置了你的财产:
@property (retain) NSString *firstName;
使用setter设置firstName
时,它将被保留。如果Person
实例随后被释放并取消分配,但firstName
尚未释放,则会泄漏。
将其放入dealloc
课程中的Person
方法:
- (void)dealloc
{
[firstName release];
[super dealloc];
}
(假设用于firstName
属性的相应ivar称为firstName
)。