2010-08-11 119 views
1

我是iPhone新手,我刚刚通过Intruments Leaks工具第一次运行我的iPhone应用程序,并使用ListViewController dataArray方法发现泄漏。iPhone内存泄漏帮助

当我点击列表时,它显示了代码,并且几行代码旁边有百分比。据推测他们是内存泄漏的线路。我贴的代码和下面的百分比:

- (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; 
} 

有什么我可以在更改代码以防止泄漏,或将需要调用代码进行的更改?

由于提前,

回答

5

如果dataArray中的存储值时,这种方法被调用时,它会泄漏,因为您在覆盖它之前不是在释放旧值。简单的解决方法是使用一个设置(可能是一个由@synthesize生成),并更改线路

[data retain]; 
dataArray = data; 

更简单的(和更传统)

[self setDataArray:data]; 

,或者,如果你愿意,

self.dataArray = data; 

之间的差
myMemberVariable = somePointerToAnObject; 

self.myMemberVariable = somePointerToAnObject; 

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

+0

这似乎已经修复它,谢谢!你能解释(或链接到)myMemberVariable和self.myMemberVariable之间的区别吗? – 2010-08-11 22:22:23

+0

对象变量(在.h文件的@interface中定义的)是所有对象方法中的局部变量(在返回类型之前用' - '定义的变量,这与类方法相反,它们是'+' “)。所以你总是可以通过名字直接引用你的变量。这是你所做的。点符号是属性的简写。如果使用它来访问该值,则会调用具有相同名称的方法(例如[self myMemberVariable]),如果使用它来设置值,则会调用[self setMyMemberVariable]。通常情况下,当... – 2010-08-11 22:34:21

+0

......你@合成一个属性时会自动执行这些方法。二传手在这里是相关的。自动创建的setter将释放旧值(如果属性是'retain'属性),保留新值并设置变量。所有这些都会更清楚一些,但是惯例是用与您的实例变量(或“ivar”)相同的名称命名您的属性,所以最终结果是它们看起来非常相似。 – 2010-08-11 22:36:01