2012-02-09 126 views
2

当我有以下功能内存泄漏排序阵列

- (NSArray *) getUsers : (days) aDay { 

    NSArray *arr = [[[NSArray alloc] init] autorelease]; 

    for (User *e in [week objectAtIndex:aDay]) { 
     //Get distance to user 
     e.place.distance = [[LocationManager sharedLocationManager] getDistanceWithLat:e.place.latitude Lon:e.place.longitude]; 
    } 

    //Sort the array 
    arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){ 
      User *e1 = (User *)obj1; 
      User *e2 = (User *)obj2; 

      if (e1.place.distance <= e2.place.distance) { 
       return (NSComparisonResult)NSOrderedAscending; 
      } else { 
       return (NSComparisonResult)NSOrderedDescending; 
      } 
     return (NSComparisonResult)NSOrderedSame; 
    }]; 

    [arr retain]; 

    return arr; 
} 

它泄漏,我无法找出如何解决它。如果我删除[arr retian],那么应用程序崩溃。

当我瓶坯动作模板仪器上这条线显示100%的泄漏:

arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){ 

我该如何解决此泄漏?

+0

它是一个正常的铸造'用户* E1 =(事件*)OBJ1;'? – beryllium 2012-02-09 22:25:32

+0

@beryllium不,更新了帖子。当我尝试一些东西的时候把它弄糊涂了。 – 2012-02-09 22:28:07

回答

2

根本除去NSArray *arr = [[[NSArray alloc] init] autorelease];[arr retain];。在第一行中,你分配了内存,但是在排序时你引用了新的数组并且泄漏了。

NSArray *arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){ 
      User *e1 = (User *)obj1; 
      User *e2 = (User *)obj2; 

      if (e1.place.distance <= e2.place.distance) { 
       return (NSComparisonResult)NSOrderedAscending; 
      } else { 
       return (NSComparisonResult)NSOrderedDescending; 
      } 
     return (NSComparisonResult)NSOrderedSame; 
    }]; 

return arr; 
0

您正在返回一个保留对象:arr。返回保留对象的方法Objective-C命名规则刚刚从new开始,或包含字copy

有没有必要alloc/init arrsortedArrayUsingComparator方法将返回一个自动发布NSArray

不要使用前缀“get”来命名方法,除非它们通过引用参数返回结果。这是基本的Objective-C命名规则,ARC依赖于遵守的命名规则。

看到苹果的文档Introduction to Coding Guidelines for Cocoa

+0

通过删除保留我得到EXC_BAD_ACCESS – 2012-02-09 22:34:29

+0

调用方需要保留它想要保留的返回值。研究Objective-C内存管理是非常值得的。另外,使用ARC。不写任何代码,你不完全理解它做什么以及为什么需要它。 – zaph 2012-02-09 22:42:25

+0

谢谢你的提示,无价。 – 2012-02-09 22:47:29