2010年8月8日日曜日

NSMutableArray への値の挿入

はまりました。メモリ管理。

NSMutableArrayに値を挿入する場合、MutableArrayが勝ってに保持してくれるものと思っていましたが、そうではないようです。一番最後の行を置き換える場合は、以下のようにコーディングします。

- (void) setInsertLastArray:(NSString *)value{
[tableOfNSArray removeLastObject];
[tableOfNSArray addObject:[value copy]];
}

と、思いましたが、どうもメモリリークが発生しているようです。何がどうなっているのやら。本来はaddObjectでCopyする必要ないですよね。たしかしに、NSArrayをalloc/initしているメソッドではcopyの必要はないです。でもここでcopyをはずすと落ちちゃうんですが・・・わからない・・・・これをやっても落ちます。

releaseしなければ落ちません。でもおかしいですよね。本来NSMutableArray側でRetainするはずですから。うーん・・・


- (void) setInsertLastArray:(NSString *)value{
  NSString *string = [[NSString alloc] initWithString:value];
  [self.tableOfCalcSign addObject:string];
[string release];
}

生成しているメソッドではreleaseしても問題なし。いったん当該メソッドからはずれると追加できない・・・謎。

もしかしてallocした場所以外で編集しようとしても、面倒は見てくれないのかもしれない。そうすると生成後、保存し、また読み出して編集か???? ほんとかよ。それなら出来そうだけど・・・


ーーーーーーーーーーーーー

原因わかりました!! iPhone Developer Program の Forumにあげたところ、メモリ管理の原則を淡々といってくださる方がいて、なやんだけっか、2つのコードの間に、テープルロードのコードがあり、そこでメモリリークが発生しているためでした。

結局 ヘッダファイルでretainしているようなオブジェクトには、allocしたようなものをいれなくても、その場限りで生成したオブジェクト ([NSStirng stringWithString:....];)を代入すれば、保持していることがようやく理解できました。

ふう、つかれたが、これでメモリ管理に自身がつきました。よかった。