Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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内存泄漏帮助_Iphone_Objective C_Cocoa_Instruments - Fatal编程技术网

iPhone内存泄漏帮助

iPhone内存泄漏帮助,iphone,objective-c,cocoa,instruments,Iphone,Objective C,Cocoa,Instruments,我是iPhone开发新手,我刚刚第一次通过Intruments Leaks工具运行了我的iPhone应用程序,发现了ListViewController dataArray方法的漏洞 当我点击列表时,它会显示代码,几行旁边有百分比。大概是这些线路在泄漏内存。我已将代码和百分比粘贴到下面: - (NSArray*) dataArray { MapViewController *map = mainWindow.mainView.mapView; NSMutableArray *data =

我是iPhone开发新手,我刚刚第一次通过Intruments Leaks工具运行了我的iPhone应用程序,发现了ListViewController dataArray方法的漏洞

当我点击列表时,它会显示代码,几行旁边有百分比。大概是这些线路在泄漏内存。我已将代码和百分比粘贴到下面:

- (NSArray*) dataArray {
   MapViewController *map = mainWindow.mainView.mapView;
NSMutableArray *data = [NSMutableArray arrayWithCapacity: 0]; /** REPORTS 25.3% HERE **/

if (selectedIndex == 1 || selectedIndex == 0)
 [data addObjectsFromArray: DataSource.data]; /** REPORTS 7.4% HERE **/

if (selectedIndex == 2 || selectedIndex == 0)
 [data addObjectsFromArray: DataSource.additionalData]; /** REPORTS 67.4% HERE **/

   [data sortUsingSelector:@selector(compareAnnotation:)];

   dataArrayNeedsUpdating = NO;
[data retain];
dataArray = data;

   return data;
}
我是否可以对代码进行任何更改以防止泄漏,或者是否需要对调用代码进行更改

提前感谢,


Ben

如果调用此方法时dataArray正在存储一个值,则该值将泄漏,因为您在覆盖旧值之前没有释放旧值。简单的解决方案是使用setter(可能是@synthesis生成的setter)并更改行

[data retain];
dataArray = data;
更简单(更传统)

或者,如果你愿意

self.dataArray = data;

两者的区别

myMemberVariable = somePointerToAnObject;


是新Objective-C编码器的一个微妙陷阱。

如果调用此方法时dataArray正在存储一个值,它将泄漏,因为在覆盖之前您没有释放旧值。简单的解决方案是使用setter(可能是@synthesis生成的setter)并更改行

[data retain];
dataArray = data;
更简单(更传统)

或者,如果你愿意

self.dataArray = data;

两者的区别

myMemberVariable = somePointerToAnObject;


这是新Objective-C编码器的一个微妙陷阱。

这似乎已经解决了它,谢谢!您能解释(或链接到)myMemberVariable和self.myMemberVariable之间的区别吗?对象变量(您在.h文件的@interface中定义)是所有对象方法中的局部变量(那些在返回类型之前用“-”定义的,与类方法“+”相反)。因此,您始终可以直接通过名称引用变量。这就是你所做的。点符号是属性的简写。如果使用它来访问值,则会调用具有相同名称的方法(例如[self myMemberVariable]),如果使用它来设置值,则会调用[self setMyMemberVariable]。通常,当。。。。。。你@synthesis一个属性。二传手是与此相关的。自动创建的setter将释放旧值(如果属性是“retain”属性),保留新值,然后设置变量。所有这些都会更清楚一点,但约定是使用与实例变量相同的名称(或“ivar”)命名属性,因此最终结果是它们看起来非常相似。啊,好吧,这肯定可以解释这一点。它还解释了为什么我不需要将初始的“returndataarray”更改为“returnself.dataArray”。谢谢这似乎已经解决了,谢谢!您能解释(或链接到)myMemberVariable和self.myMemberVariable之间的区别吗?对象变量(您在.h文件的@interface中定义)是所有对象方法中的局部变量(那些在返回类型之前用“-”定义的,与类方法“+”相反)。因此,您始终可以直接通过名称引用变量。这就是你所做的。点符号是属性的简写。如果使用它来访问值,则会调用具有相同名称的方法(例如[self myMemberVariable]),如果使用它来设置值,则会调用[self setMyMemberVariable]。通常,当。。。。。。你@synthesis一个属性。二传手是与此相关的。自动创建的setter将释放旧值(如果属性是“retain”属性),保留新值,然后设置变量。所有这些都会更清楚一点,但约定是使用与实例变量相同的名称(或“ivar”)命名属性,因此最终结果是它们看起来非常相似。啊,好吧,这肯定可以解释这一点。它还解释了为什么我不需要将初始的“returndataarray”更改为“returnself.dataArray”。谢谢