2011-10-18 118 views
0

我在我的目標C代碼中的內存泄漏有點麻煩。任何人都可以看一看,讓我知道他們在想什麼?iOS的NSMutableArray內存泄漏

NSStringArray.h

@interface NSStringArray : NSObject { 

NSMutableArray *realArray; 

} 

@property (nonatomic, assign) NSMutableArray *realArray; 

-(id)init; 
-(void)dealloc; 
@end 

NSStringArray.m

#import "NSStringArray.h" 


@implementation NSStringArray 

@synthesize realArray; 

-(id)init { 

self = [super init]; 
if (self != nil) { 
    realArray = [[[NSMutableArray alloc] init] retain]; 
} 
return self; 
} 

-(void)dealloc { 
[realArray release]; 
realArray = nil; 
[super dealloc]; 
} 

Factory.m

+(NSStringArray *)getFields:(NSString *)line { 
//Divides the lines into input fields using "," as the separator. 
//Returns the separate fields from a given line. Strips out quotes & carriage returns. 

line = [line stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 
line = [line stringByReplacingOccurrencesOfString:@"\r" withString:@""]; 

NSStringArray *fields = [[NSStringArray alloc] init]; 

for (NSString *field in [line componentsSeparatedByString:@","]) { 
    [fields.realArray addObject:field]; 
    [field release];  
} 

return [fields autorelease]; 
} 

泄漏工具說,當字段被分配發生泄漏,當我將字段字符串添加到字段數組。

另外,這個函數正在調用我正在解析的文件的每一行。

任何提示將有所幫助。

謝謝!

回答

3

在這段代碼中,你打破了內存管理規則。

for (NSString *field in [line componentsSeparatedByString:@","]) { 
    [fields.realArray addObject:field]; 
    [field release];  
} 

您不擁有field指向的對象,因此您不得釋放它。

你有過度發佈的領域,所以釋放它的最後一個對象(在你的情況下的autorelease池)釋放一個已經dealloc'd的對象。

+0

這就是問題所在!非常感謝! –

4

這行做了雙重保留:

realArray = [[[NSMutableArray alloc] init] retain]; 

它足夠

realArray = [[NSMutableArray alloc] init]; 
+0

這就是我的想法,但是當我取出保留應用程序與EXEC_BAD_ACCESS崩潰。 –

+1

@Erik Rodriguez:那你在其他地方有問題。 – Chuck

+1

這是正確的(+1),但請參閱我的答案,以瞭解爲什麼當您留出保留時發生崩潰。 – JeremyP

1

the docs

的分配消息做其他重要的事情除了分配 內存:

  • 它將對象的保留計數設置爲1(如「內存管理工作原理」中所述)。

因此,您不需要保留剛剛分配的內容。

+0

這就是我的想法,但是當我取出保留時,應用程序會與EXEC_BAD_ACCESS一起崩潰。它看起來像autorelease池發佈時是崩潰。 –

+0

這是因爲你正在釋放你不應該的東西。請閱讀@ JeremyP的回答,然後閱讀[內存管理規則](http://tinyurl.com/6ktdglb)。 – Caleb

1

添加到Felz上面的答案。分配陣列

self.realArray = [[NSMutableArray alloc] init]; 

時,因爲你已經創建了一個屬性陣列,因此最好使用使用self.realArray「自我

1

你也可以利用屬性的客觀C到使 更清晰高效的代碼:

NSStringArray。^ h

@interface NSStringArray : NSObject { 
} 
@property (nonatomic, retain) NSMutableArray *realArray; 
@end 

NSStringArray.m

#import "NSStringArray.h" 

@implementation NSStringArray 

@synthesize realArray = _realArray; 

-(id)init { 

self = [super init]; 
if (self) { 
    self.realArray = [NSMutableArray array]; 
} 
return self; 
} 

-(void)dealloc { 
[_realArray release]; 
[super dealloc]; 
} 

現在,隨着屬性的修改retain realArray您可以使用 [NSMutableArray array]返回一個自動釋放的可變數組。

保留屬性自己管理保留/釋放的東西。

您不需要使用realArray = nil;行。您已經取消分配 的財產。

希望這可以幫助。

+0

非常好的建議!我對Objective-C仍然很陌生,任何最佳實踐都非常受歡迎!謝謝! –