代码之家  ›  专栏  ›  技术社区  ›  Ben Dowling

iPhone内存泄漏帮助

  •  1
  • Ben Dowling  · 技术社区  · 14 年前

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

    该代码中是否有任何可以更改的内容以防止泄漏,或者是否需要在调用代码中进行更改?

    事先谢谢,

    1 回复  |  直到 14 年前
        1
  •  5
  •   Seamus Campbell    14 年前

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

    [data retain];
    dataArray = data;
    

    更简单(更传统)

    [self setDataArray:data];
    

    或者,如果你愿意,

    self.dataArray = data;
    

    两者之间的区别

    myMemberVariable = somePointerToAnObject;
    

    self.myMemberVariable = somePointerToAnObject;
    

    对于新的Objective-C编码器来说,这是一个微妙的问题。