【问题标题】:iPhone memory leak helpiPhone内存泄漏帮助
【发布时间】:2011-03-28 15:02:00
【问题描述】:

我是 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;
}

我可以在该代码中更改什么以防止泄漏,还是需要在调用代码中进行更改?

提前致谢,

【问题讨论】:

    标签: iphone objective-c cocoa instruments


    【解决方案1】:

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

    [data retain];
    dataArray = data;
    

    更简单(和更传统)

    [self setDataArray:data];
    

    或者,如果你愿意,

    self.dataArray = data;
    

    两者的区别

    myMemberVariable = somePointerToAnObject;
    

    self.myMemberVariable = somePointerToAnObject;
    

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

    【讨论】:

    • 这似乎已经解决了,谢谢!你能解释(或链接到)myMemberVariable 和 self.myMemberVariable 之间的区别吗?
    • 对象变量(您在 .h 文件中的 @interface 中定义)是所有对象方法中的局部变量(在返回类型之前用“-”定义的那些,与类方法,即“+”)。因此,您始终可以直接按名称引用您的变量。这就是你所做的。点表示法是属性的简写。如果您使用它来访问值,则调用具有相同名称的方法(例如 [self myMemberVariable]),如果您使用它来设置值,则调用 [self setMyMemberVariable]。通常,您会在 ... 时自动创建这些方法
    • ...你@synthesize 一个属性。 setter 在这里是相关的。自动创建的 setter 将释放旧值(如果属性是“保留”属性),保留新值并设置变量。所有这些都会更清楚一点,但惯例是使用与实例变量(或“ivar”)相同的名称来命名您的属性,因此最终结果是它们看起来非常相似。
    • 啊,好吧——这绝对可以解释。它还解释了为什么我不需要将初始的“return dataArray”更改为“return self.dataArray”。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多