2011-10-21 20 views
2

リークは、以下がメモリリークであることを私に伝えていますが、なぜそれがわかりません。iOSメモリ管理

TitledArray.h

@interface TitledArray : NSObject { 

NSMutableArray *realArray; 
BOOL uniqueTitles; 
BOOL uniqueIDs; 

} 

@property (nonatomic) BOOL uniqueTitles; 
@property (nonatomic) BOOL uniqueIDs; 
@property (nonatomic, retain) NSMutableArray *realArray; 

TitledArray.m

-(id)init { 
return [self initWithUniqueTitles:FALSE uniqueIDs:FALSE]; 
} 

-(id)initWithUniqueTitles:(BOOL)titles uniqueIDs:(BOOL)IDs { 

if (self = [super init]) { 
    //self.realArray = [[NSMutableArray alloc] init]; 
    self.realArray = [NSMutableArray array]; 
    self.uniqueTitles = titles; 
    self.uniqueIDs = IDs; 
} 
return self; 
} 

MissionLoading.h

@interface MissionLoading : TitledObject { 


TitledArray *storageWeights; 
TitledArray *passengerWeights; 

} 


@property (nonatomic, retain) FloatArray *storageWeights; 
@property (nonatomic, retain) FloatArray *passengerWeights; 

MissionLoading.m

@synthesize storageWeights; 
@synthesize passengerWeights; 


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


    self.storageWeights = [[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE]; 
    self.passengerWeights = [[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE]; 

} 

return self; 
} 

-(void)dealloc{ 

[storageWeights release]; 
[passengerWeights release]; 

[super dealloc]; 
} 

コード:

for (int i = 0; i < recordCount; i++) 
{ 
    loading = [[MissionLoading alloc] init]; 

    // add to array 

    [loading release]; 
} 

ルートリークがself.realArray = [NSMutableArrayの配列]を有するTitledArrayオブジェクトです。

私はまだiOS開発の新機能ですが、これは私にはよく見えます。どんな考えが役に立つでしょう。必要に応じてさらに情報を提供することができます。

ありがとうございます!

答えて

2

@property宣言でretainを持っているプロパティに割り当てて、合成されたセッターが既に値を保持し、あなたがそうのように、プロパティに割り当てる事にautoreleaseので:私は両方の提案をした

-(id)init { 
    if (self = [super init]) { 
     self.storageWeights = [[[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE] autorelease]; 
     self.passengerWeights = [[[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE] autorelease]; 
    } 
    // .... 
} 
+0

それは問題だった。私はおそらくそれを考え出したことはないだろう! –

0

あなたは//self.realArray = [[NSMutableArray alloc] init]のように見えます。 initの中で。クリーンなビルドを行い、再度ツールを実行します。その古いコードは何らかの理由でそこにあったかもしれませんし、確かにリークとしてフラグが立てられます。

もう1つは、self.realArray = nilをTitledArrayのdeallocに入れます。

+0

それはまだ漏れていると言っている:( –

+2

@ chownの答えを参照してください – logancautrell