2012-04-10 110 views
0

有內存泄漏在下面self.listOfCustDetail和self.listOfCustomer內存泄漏,跟蹤時間長

-(void) calCustList { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *plistPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"customer.plist"]; 

    self.listOfCustDetail = [[[NSMutableArray alloc] init] autorelease]; 
    self.listOfCustomer = [[[NSMutableArray alloc] init] autorelease]; 
    self.customers = [[[NSMutableDictionary alloc] initWithContentsOfFile:plistPath] autorelease]; 

    [self.listOfCustomer removeAllObjects]; 
    [self.listOfCustDetail removeAllObjects]; 

    [self.listOfCustomer addObject:@"新紀錄"]; 
    [self.listOfCustDetail addObject:@""]; 

    for (id key in self.customers) { 
     NSString *s = [NSString stringWithFormat:@"%@,%@,%@,%@", [[self.customers objectForKey:key] objectAtIndex:0], [[self.customers objectForKey:key] objectAtIndex:1], [[self.customers objectForKey:key] objectAtIndex:2], [[self.customers objectForKey:key] objectAtIndex:3]]; 
     [self.listOfCustomer addObject:key]; 
     [self.listOfCustDetail addObject:s]; 
    } 
} 
+1

你怎麼知道有泄漏? – 2012-04-10 15:45:17

回答

0

如何你的屬性definied?他們保留嗎?如果他們確實保留,那麼您所展示的這段代碼中沒有實際的錯誤。

該方法多久調用一次?如果它經常被調用,你可以使用自定義的NSAutoreleasePool

而且不需要新initalized陣列上的以下兩行:

[self.listOfCustomer removeAllObjects]; 
[self.listOfCustDetail removeAllObjects]; 

你展示實際的源代碼?

+0

我不能相信這是實際的源代碼,因爲他經歷了創建listOfCustomer和listOfCustDetail的努力,並且沒有對它們做任何事情。我同意,如果他泄露了密碼,他必須在他尚未與我們分享的代碼部分中隱含保留。 – Rob 2012-04-10 16:43:52

+0

以及數據存儲在成員..所以也許它是真正的代碼..但無論如何。該代碼沒有錯誤..他需要向我們展示更多/真實的代碼。 – calimarkus 2012-04-10 16:50:38

+0

非常正確,調用calCustList的方法可能會使用這些ivars。但是如果他泄漏了,那就是這些listOfCustomer和listOfCustDetail被保留在其他地方。可能是user1324421將命令-B轉換爲「分析」用於適當平衡分配/入口和釋放的代碼的時間。或者開始放入檢查你的保留計數等的nslog語句。或者轉移到ARC,並且這種愚蠢感會消失。 – Rob 2012-04-10 17:15:08

0

我想建議,在項目中啓用ARC(自動引用計數),因爲你不需要釋放陣列