2012-01-27 6 views
0

私が作成したクラスの楽器でメモリリークが発生しています。3つのNSMutableArraysを持つクラスのメモリリーク。どうして?

このクラスは、3 NSMutableArrayのを持っていた.h

#import <Foundation/Foundation.h> 


@interface RDItem : NSObject { 

} 
@property int Id; 
@property (nonatomic, retain) NSString *nombre; 
@property (nonatomic, retain) NSString *thumbnail; 
@property (nonatomic, retain) NSString *thumbnailPush; 
@property int defaultColorId; 
@property int idTema; 

@property (nonatomic, retain) NSString *selectedFrame; 
@property (nonatomic, retain) NSString *mergedFrame; 

@property (nonatomic, retain) NSMutableArray *colors; 
@property (nonatomic, retain) NSMutableArray *textures; 
@property (nonatomic, retain) NSMutableArray *styles; 

-(void)initialize; 
@end 

.M

#import "RDItem.h" 


@implementation RDItem 
@synthesize Id; 
@synthesize nombre; 
@synthesize thumbnail; 
@synthesize thumbnailPush; 
@synthesize defaultColorId; 
@synthesize idTema; 
@synthesize selectedFrame; 
@synthesize mergedFrame; 

@synthesize colors; 
@synthesize textures; 
@synthesize styles; 

-(void)initialize 
{ 
    colors = [[NSMutableArray alloc] init]; 
    textures = [[NSMutableArray alloc] init]; 
    styles = [[NSMutableArray alloc] init]; 
} 
-(void)dealloc 
{ 
    [colors release]; 
    [textures release]; 
    [styles release]; 
} 
@end 

私はデータを格納します:これはクラスです。このクラスを準備して初期化するために、3つの配列が作成される場所を初期化するメソッドを開発しました。 deallocで解放されます。

initializeメソッドが原因で、このクラスが使用されるたびにリークツールがリークを検出します。

これらの配列を初期化する最良の方法はどれですか?

ありがとうございました。

EDIT

こんにちは私はRDItemとのリークを解決しましたが、現在は非常によく似たクラス内の別のリアが表示されました:

の.h

#import <Foundation/Foundation.h> 

@interface RDTema : NSObject { 

} 
@property int Id; 
@property (nonatomic, retain) NSString *idManifest; 
@property (nonatomic, retain) NSString *idTema; 
@property (nonatomic, retain) NSString *nombre; 
@property (nonatomic, retain) NSString *thumbnail; 
@property (nonatomic, retain) NSString *thumbnailPush; 

@property (nonatomic, retain) NSMutableArray *items; 

@property (nonatomic, retain) NSMutableArray *colors; 
@property (nonatomic, retain) NSMutableArray *textures; 
@property (nonatomic, retain) NSMutableArray *styles; 

-(void)initialize; 
@end 

.M

#import "RDTema.h" 


@implementation RDTema 
@synthesize Id; 
@synthesize idManifest; 
@synthesize idTema; 
@synthesize nombre; 
@synthesize thumbnail; 
@synthesize thumbnailPush; 

@synthesize items; 

@synthesize colors; 
@synthesize textures; 
@synthesize styles; 

-(void)initialize 
{ 
    /* 
    self.items = [[NSMutableArray alloc] init]; 
    self.colors = [[NSMutableArray alloc] init]; 
    self.textures = [[NSMutableArray alloc] init]; 
    self.styles = [[NSMutableArray alloc] init]; 
    */ 

    self.items = [NSMutableArray array]; 
    self.colors = [NSMutableArray array]; 
    self.textures = [NSMutableArray array]; 
    self.styles = [NSMutableArray array]; 
} 
-(void)dealloc 
{ 
    [idManifest release]; 
    [idTema release]; 
    [nombre release]; 
    [thumbnail release]; 
    [thumbnailPush release]; 

    [items release]; 
    [colors release]; 
    [textures release]; 
    [styles release]; 

    [super dealloc]; 
} 

これらの行にはリークが発生しています:

self.items = [NSMutableArray array]; 
self.colors = [NSMutableArray array]; 
self.textures = [NSMutableArray array]; 
self.styles = [NSMutableArray array]; 

誰でもこのクラスではなぜRDItemクラスではないのか説明できますか?同じ:(

おかげである。

+1

ですが、実装しても共有しているコード行で実際のメモリリークが発生していないようです。私はより良い実装を共有しましたが。 – samfisher

+2

コードにリークはありません。しかし、私はいくつかの質問があります:1) "initialize"メソッドを何度呼びますか? 2)可変配列に挿入されたオブジェクトを解放しますか? – SVGreg

答えて

2

これはあなたが私は確かに言うことはできませんRDItemを初期化されたコードを見ずに、より良い提案実装

-(void)initialize 
{ 
    self.colors = [NSMutableArray array]; 
    self.textures = [NSMutableArray array]; 
    self.styles = [NSMutableArray array]; 
} 
-(void)dealloc 
{ 
    self.colors = nil; 
    self.textures = nil; 
    self.styles = nil; 
} 
+0

そして、 '[super dealloc];'を忘れないでください。 – DarkDust

+0

これは適用されるソリューションです:)ありがとう! – NemeSys

+0

@samfisherなぜ 'release'の代わりに' nil'を設定したのか説明できますか? 'nil'は' viewDidUnload'のIBOutletsだけに設定されていると思いました。編集:申し訳ありません、私のミスあなたはそれらを 'alloc'していました – iNoob

0

です。

しかし、私は、新しいものを作成する前にあなたの以前のRDItemを公開していないと予想しているので、確実に言うことができるようにRDIを作成しているコードを投稿してください。

-1

Ju必要なときにはinitにしてください。 とinitを呼び出すと、内容がnilの配列に保持されます。 allocinitWithObjects:と呼び出し、配列を入力します。

1

初期化メッセージを複数回呼び出すため、変数を解放していないため、リークが発生していると思います。

通常、setterまたはgetterを使用してivarsにアクセスする必要があるため、適切な操作が呼び出されます(setterに新しい値を割り当てる前のリリースメッセージなど)。

そして、あなたのdeallocのための最後の命令として[スーパーdeallocを]を呼び出すことを忘れないでください;)

0

私が思うに、そのリークは、コードを充填配列であるinitのではありません。例えば、あなたはいくつかのNSStringをallocして初期化し、NSMutable配列にそれを解放せずに置くか、autoreleaseします。またはこのようなもの。あなたの配列を正しい方法で満たしてくれるようにしましょう。

関連する問題