0

ヘッダーファイルでNSMutableArrayを次のように宣言しました。

NSMutableArray *myMuArr;

@property (nonatomic, retain) NSMutableArray *myMuArr;

.mファイルには、他のクラスからのデリゲートがあります。

-(void)didGrabData:(NSArray*)theArray {
self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain];
}

cellForRowAtIndexPathのself.myMuArrにアクセスしたい場合は、空です(配列の保持カウントを確認したところ、0です)

私は何が間違っているのですか?

もちろん、それはdeallocでリリースされ、他の場所ではリリースされません。

私はどんな助けにも非常に感謝します:0)

4

2 に答える 2

1

配列が存在する前にそれ自体のコンテンツで配列を初期化しようとしたことがなければ、保持カウントは3になるはずです。次のコード行を置き換えてみてください。

self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain];

この行で:

self.myMuArr = [NSMutableArray arrayWithArray:theArray];
于 2010-06-13T20:47:42.067 に答える
1

いつ保持して解放するかを理解していないと思います。このSOの質問と回答を見てください。よく読んで理解し、リンク先の記事を読んでください。それはあなたを大いに助けます。iPhoneでこれを理解することが不可欠です。

配列は 3 回保持されますが、必要なのは 1 つだけです: (1) alloc/init を呼び出すと、所有する配列が取得されます (保持されます)。(2)retainを呼び出したとき、それは追加のretainです。(3) セッター self.myMuArr は @property で保持するように定義されているため、セッター メソッドを使用してポインターを割り当てると、再び保持されます。

コードで次の 2 つの手法が使用されていることがよくありますが、どちらも正しいものです。

-(void)didGrabData:(NSArray*)theArray {
   NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:obj1, obj2, nil];
   self.myMutArr = arr;
   [arr release];       
}

または、arrayWithObjects を使用すると、メモリ空間の所有権を取得して維持したい場合に保持する必要がある、自動解放された配列が得られます。あなたのセッターはそれを行います:

-(void)didGrabData:(NSArray*)theArray {
   self.myMutArr = [NSMutableArray arrayWithObjects:obj1, obj2, nil];
}
于 2010-06-13T22:19:02.107 に答える