2011-04-13 20 views
0

我目前有一個NSMutableArray類別,創建一個NSMutableArray與NSNulls傳播。當我運行在儀器這段代碼它告訴我,我有一個泄漏這裏(閱讀評論,看看那裏)泄漏NSMutableArray類別,返回數組充滿NSNull

#import "NSMutableArray+NSNull.h" 


@implementation NSMutableArray (NSNull) 

-(id)initWithNullCapacity:(int)capacity{ 

    self = [super init]; 
    if (self) { 
     //Leak on [self init] 
     NSMutableArray *array = [self init]; 

     for (unsigned i = 0; i < capacity; i++) 
     { 
      [array addObject:[NSNull null]]; 
     } 
     self = array; 
    } 
    return self; 
} 

編輯:

這是我調用的方法:

#import "TWVStatData.h" 
#import "NSMutableArray+NSNull.h" 

@implementation TWVStatData 

@synthesize creationTime; 
@synthesize graphs; 
@synthesize elements; 
@synthesize type; 

-(id)init{ 
    if(self == [super init]){ 
     type = -1; 

     creationTime = [[NSDate alloc] init]; 

     graphs = [[NSMutableArray alloc] initWithNullCapacity:3]; 
     elements =[[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

回答

2

沒有創建一個子類NSMutableArray裏的,只是增加一個類別,因此調用任務[超級初始化]將調用的NSArray而不是NSMutableArray的初始化,whetever它我會打電話,以防萬一它重要。

而且,如獵食提到的,設置自=而不調用[自我釋放]第一會泄漏以前的對象,將其從所述的alloc呼叫一層在調用堆棧向上返回。

這是你應該做的:

-(id)initWithNullCapacity:(int)capacity 
{ 
    self = [self initWithCapacity:capacity]; 
    if (self) 
    { 
     for (int i = 0; i < [self count]; i++) 
     { 
      [self addObject:[NSNull null]]; 
     } 
    } 
    return self; 
}  
+0

當我做你的建議,儀器告訴我,我有一個線上自我= [selfinitWithCapacity:容量]泄漏; – Cyprian 2011-04-13 17:47:01

+0

@Cyprian你能發佈使用這種方法的代碼嗎?真的不應該有什麼錯... – 2011-04-13 18:32:43

+0

使用它的代碼張貼在我的問題編輯 – Cyprian 2011-04-13 18:34:16

2

是的,它會因爲一線

self = [super init]; 

你是c-重寫一個對象(self),並在self = array;處取消引用self並重新分配它。所以早期的價值在泄漏。

+0

謝謝,但你能明確告訴我該怎麼改變方法嗎? – Cyprian 2011-04-13 17:20:40

1
-(id)initWithNullCapacity:(int)capacity 
{ 
    self = [super init]; 
    if (self) { 
     for (unsigned i = 0; i < capacity; i++) 
     { 
      [self addObject:[NSNull null]]; 
     } 
    } 
    return self; 
} 

應該做

+0

那麼當我這樣做,編譯器給我一個錯誤: - [NSMutableArray裏數]:發送到一個未初始化的可變數組對象 – Cyprian 2011-04-13 17:02:10

+0

hmmmz方法,我試了一下,並沒有得到任何錯誤。 – mbehan 2011-04-13 17:09:10

3

這將是棘手的,主要是因爲如何NSArray作品下方。我建議這樣做:

- (id)initWithNullCapacity:(NSUInteger)capacity { 
    NSMutableArray *nulls = [NSMutableArray array]; 
    for (NSUInteger i = 0; i < capacity; i++) { 
    [nulls addObject:[NSNull null]]; 
    } 
    return [self initWithArray:nulls]; 
} 

我認爲這個問題是從分配所產生到self,雖然我不知道這一點。 NSArray在引擎蓋下做了一些時髦的優化,因此我會避免調用NSArray初始值設定項,直到之後您已準備好所有數據。

+0

當我在樂器中運行你的代碼時,我得到了一個在線返回[self initWithArray:nulls];經過試驗和錯誤之後,我設法通過我作爲答案發布的實現來修復它。 – Cyprian 2011-04-13 17:58:11

+0

@Cyprian那麼你所做的是錯的,因爲當我使用這個在一個孤立的方式,它與無泄漏完美。 – 2011-04-13 18:05:17

+0

+1看起來不錯,但我想價格保持在內存中,而不是一個2列了一會,不,我認爲這將不會造成任何實際意義 – 2011-04-13 18:05:22