2012-08-22 189 views
0

我使用下面的代碼來創建NSMutableArray。當我在「Profile」模式下運行時,它顯示內存泄漏。帶內存泄漏的NSMutableArray

SampleArray.h

@interface SampleArray: NSObject { 
} 
@property (assign, retain) NSMutableArray *array; 
@end 

SampleArray.m

#import "SampleArray.h" 
@implementation SampleArray 
@synthesize array; 
-(void) viewDidLoad { 
    self.array =[ [NSMutableArray alloc] init]; 
} 

-(void) viewWillDisappear:(BOOL)animated { 
    [self.array release]; 
} 
@end 

當我使用自動釋放,那麼我能不能訪問相同的其他函數或方法,並返回空值。請幫我找到問題。

+2

您不能同時使用分配和保留。 –

回答

0

嘗試將其設置爲(非原子,保留),然後自動釋放。

+0

對不起,我正在使用(nonatomic,retain) – user1587610

1

在viewWilLDisappear中釋放這個數組並不是一個好主意,你應該在dealloc函數中釋放。您應該擔心過度釋放此項目並導致程序崩潰,因爲在此ViewController的生命週期中,viewWilLDisappear可能會多次調用。

不管怎樣,你都是雙保怎麼一回事,因爲你的財產的項目有一個保留它(並使其非原子,不分配),一個自動添加到您的分配/初始化:

self.array =[[[NSMutableArray alloc] init] autorelease]; 

和移動

[array release]; 

到你的dealloc函數。或轉換成ARC不用擔心任何更長......

+0

我在dealloc方法中釋放了數組,並仍然顯示內存泄漏。任何猜測? – user1587610

+0

如果你不確定,你可以NSLog記錄對象的retainCount屬性。當調用dealloc時,它應該= 1 – CSmith

+0

我在初始化後得到retainCount 2,並且無法在dealloc方法中獲得retainCount。它是拋出錯誤信息。 – user1587610

0

所有我假設你正在使用

@property (nonatomic, retain) NSMutableArray *array; 

使用本

-(void) viewDidLoad { 
    array =[[NSMutableArray alloc] init]; 
} 

-(void) viewWillDisappear:(BOOL)animated { 
    [array release]; 
} 

首先我會建議您而不是使用的dealloc viewWillDisappear

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

代碼的說明

-(void) viewDidLoad { 
     // here you are allocating a mutable array thus retain count becomes one 
     // then you are assigning it to the property which is retain and thus retains it 
     // making the retain count 2 
     self.array =[ [NSMutableArray alloc] init]; 
    } 

    -(void) viewWillDisappear:(BOOL)animated { 
     // here you are releasing it so its retain count becomes 1 from 2 
     // thus shows memory leak 
     [self.array release]; 
    } 
0

這是更好地處理內存重新分配你的-dealloc(),並設置你的陣列零在你的-viewDidUnload()

所以它更安全將是:

-(void) viewDidUnload 
{ 
    self.array = nil; 
} 

-(void) dealloc 
{ 
    [array release]; 

    [super dealloc]; 
} 

,並像其他人說,聲明你的財產(非原子,保留)代替(分配,保留)