- Date: Fri 26 12 ,2008
- Category: SDK
- Tags: ---
- Response: Comment 0 Trackback 0
見落としてしまうメモリーリーク
[iPhone][Mac]

私のアプリを買っていただく人が少しはでてきたようなので
少しほっとしてます。バージョン1.1では、プロセスの表示が追加されます。
メモリークリーニングとかいろいろアップデートに向けて着々と準備中です。
どうか、皆様よろしくお願いします。
ふ?
自分がアプリを申請したときは、無料のアプリもでてなかったし、
最初にでたアプリもバージョン1.0だったんで、そんなに心配して
なかったんですが、えらい差をつけられてしまった。
買っていただけないのもしょうがないと思ってます。
でも、期待(誰もしてないかw)を裏切らないようにアップデート
していきます。
で、ここからが今日の本題です。
開発のブログといいながら、あまり記事にしてない?w
今日は気をつけた方がいいメモリーリークの落とし穴です。
もちろん iPhone だけではなくて、Mac というか Cocoa ですね。
iPhoneは、みなさんの知っているとおりメモリーが少ないですよね。
開発にあたっては、メモリー効率を考えてプログラムしなければ
いけませんよね。
ということで、初めてのサンプルコードを...
if (err == 0) {
int *buffer;
buffer = malloc(length);
if(buffer == NULL){
return;
}
count = 10;
for(int i = 0; i < count; i++){
[self.hage addObject: [[Hoge alloc]
initWithHoge:&(buffer[i])]];
}
free(buffer);
一部のコードですがわかりますでしょうか?
これは、しっかりメモリーリークしています。
for文でNSMutableArrayにaddObjectしてるんですが
Hogeをallocしているのにreleaseしていませんよね。
これって以外と気がつかないんですよ。
正解のコードは、
for(int i = 0; i < count; i++){
Hoge *hoge = [[Hoge alloc] initWithHoge:&(buffer[i])];
[self.hage addObject: hoge];
[hoge release];
}
free(buffer);
ようするに面倒なんですけど一回hogeのインスタンスを作って
それをaddObjectして、NSMutabuleArrayにいれたあと
hogeをリリースするということですね。
NSArrayは、addObjectしたものにはretainしますので
hogeのインスタンスはリリースしても大丈夫ってことです。
*開発のチュートリアルですが、すごくわかりやすく書いてる方
がいます。もう、わかりますよね!もとまかさんです。
今は、第四回目に突入しております。
人に理解してもらうように書くというのは、とても難しいです。
もとまかさんは、最小限の説明で疲れさせないように
書いてるんだと思います。
かごおたさんも記事にしておられましたが
本気になって本を書いたらすごくうれそうです。
もとまかさん、すごく開発のスキルありそうですよね。
長くなりましたが、ぜひ一度のぞいて見てください。
開発できるようになりますよ?!

私のアプリを買っていただく人が少しはでてきたようなので
少しほっとしてます。バージョン1.1では、プロセスの表示が追加されます。
メモリークリーニングとかいろいろアップデートに向けて着々と準備中です。
どうか、皆様よろしくお願いします。
ふ?
自分がアプリを申請したときは、無料のアプリもでてなかったし、
最初にでたアプリもバージョン1.0だったんで、そんなに心配して
なかったんですが、えらい差をつけられてしまった。
買っていただけないのもしょうがないと思ってます。
でも、期待(誰もしてないかw)を裏切らないようにアップデート
していきます。
で、ここからが今日の本題です。
開発のブログといいながら、あまり記事にしてない?w
今日は気をつけた方がいいメモリーリークの落とし穴です。
もちろん iPhone だけではなくて、Mac というか Cocoa ですね。
iPhoneは、みなさんの知っているとおりメモリーが少ないですよね。
開発にあたっては、メモリー効率を考えてプログラムしなければ
いけませんよね。
ということで、初めてのサンプルコードを...
if (err == 0) {
int *buffer;
buffer = malloc(length);
if(buffer == NULL){
return;
}
count = 10;
for(int i = 0; i < count; i++){
[self.hage addObject: [[Hoge alloc]
initWithHoge:&(buffer[i])]];
}
free(buffer);
一部のコードですがわかりますでしょうか?
これは、しっかりメモリーリークしています。
for文でNSMutableArrayにaddObjectしてるんですが
Hogeをallocしているのにreleaseしていませんよね。
これって以外と気がつかないんですよ。
正解のコードは、
for(int i = 0; i < count; i++){
Hoge *hoge = [[Hoge alloc] initWithHoge:&(buffer[i])];
[self.hage addObject: hoge];
[hoge release];
}
free(buffer);
ようするに面倒なんですけど一回hogeのインスタンスを作って
それをaddObjectして、NSMutabuleArrayにいれたあと
hogeをリリースするということですね。
NSArrayは、addObjectしたものにはretainしますので
hogeのインスタンスはリリースしても大丈夫ってことです。
*開発のチュートリアルですが、すごくわかりやすく書いてる方
がいます。もう、わかりますよね!もとまかさんです。
今は、第四回目に突入しております。
人に理解してもらうように書くというのは、とても難しいです。
もとまかさんは、最小限の説明で疲れさせないように
書いてるんだと思います。
かごおたさんも記事にしておられましたが
本気になって本を書いたらすごくうれそうです。
もとまかさん、すごく開発のスキルありそうですよね。
長くなりましたが、ぜひ一度のぞいて見てください。
開発できるようになりますよ?!
- 関連記事