2012-02-09 38 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