Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标C NSCFString使用NSMUTABLE阵列泄漏_Iphone_Objective C_Xcode_Memory Leaks_Instruments - Fatal编程技术网

Iphone 目标C NSCFString使用NSMUTABLE阵列泄漏

Iphone 目标C NSCFString使用NSMUTABLE阵列泄漏,iphone,objective-c,xcode,memory-leaks,instruments,Iphone,Objective C,Xcode,Memory Leaks,Instruments,我正在清理电话簿iPhone应用程序中的代码,Instruments中的泄漏工具报告我正在泄漏NSCFString对象。以下是我遵循的模式: 我的应用程序中有一个Person类,它只包含本地NSString成员和名字、姓氏等的相关属性 我的视图控制器有一个NSMutableArray属性,该属性是从searchBarSearchButtonClicked事件中的SQLite数据库填充的。此NSMutableArray由用于填充我的tableview控件的Person对象填充。此外,如果用户单击视

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

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

我的视图控制器有一个NSMutableArray属性,该属性是从searchBarSearchButtonClicked事件中的SQLite数据库填充的。此NSMutableArray由用于填充我的tableview控件的Person对象填充。此外,如果用户单击视图中的某个人,他们的person对象将传递到Detail视图,以查看除姓名以外的其他信息

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

现在,当我执行第二次查找时,理想情况下我希望清除NSMutableArray并使用新的结果集重新加载它,而不会泄漏内存。为此,我在personList属性上调用removeAllObjects,然后调用数据库重新填充personList NSMutableArray,如下所示:

[self.personList removeAllObjects];
self.personList = [SearchService GetPersonList:searchText];
[list reloadData];
通过调用removeAllObject,我已经消除了以前和Person对象相关的泄漏。但是,我现在似乎正在泄漏单个Person对象的属性中留下的NSString对象

这可能吗

我不熟悉Instruments工具,但从我钻研其中一个NCSFString泄漏时的扩展细节可以看出,堆栈中的最后一行代码通常指向属性的@synthesis代码行,例如:

@synthesize firstName;

所以,这就是为什么我认为这些字符串没有得到清理。有没有更好的方法不产生内存泄漏

是否为Person类释放
dealoc
方法中的
NSString
s

假设您将财产设置为:

@property (retain) NSString *firstName;
当您使用setter设置
firstName
时,它将被保留。如果
Person
实例随后被释放并解除分配,但
firstName
尚未释放,它将泄漏

将其放入
Person
类中的
dealloc
方法中:

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

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

如果可以为Person类发布代码,则可能更容易诊断发生了什么。这似乎是可行的。然而,XCode 3.2.1中的代码分析器在我发布的dealoc方法中评论道:“调用方此时不拥有对象引用计数的错误递减”。想法?代码分析器认为在
-dealloc
中使用访问器方法是一个错误,并警告您这一点–关于在
init
dealloc
中使用访问器是否有效,存在一些争论,但我认为普遍的共识是避免使用,直接访问IVAR(对不起,以前应该指出这一点)。虽然我的属性设置为:@property(非原子,赋值)NSString*name,但这对我来说很有效;