AppleWalker

Walker Softwareのサポートページです。 Mac iPhoneなどApple系のことを書いていきたいと思います。 訪問してくれた、みなさんよろしくね。(^^)ニコ

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
12



応援しよう!
banner3.jpg
 
 
 
アクセス数
 
 
Twitter
 
 
 
 
 
 
Apple-Style Plus
 
 
ApplePeople
 
 
 
 
 
 
 
 
全記事表示リンク
 

見落としてしまうメモリーリーク

[iPhone][Mac]

iphone_sdk.png

私のアプリを買っていただく人が少しはでてきたようなので
少しほっとしてます。バージョン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のインスタンスはリリースしても大丈夫ってことです。

*開発のチュートリアルですが、すごくわかりやすく書いてる方
 がいます。もう、わかりますよね!もとまかさんです。
 今は、第四回目に突入しております。

 人に理解してもらうように書くというのは、とても難しいです。
 もとまかさんは、最小限の説明で疲れさせないように
 書いてるんだと思います。
 かごおたさんも記事にしておられましたが
 本気になって本を書いたらすごくうれそうです。
 もとまかさん、すごく開発のスキルありそうですよね。
 
長くなりましたが、ぜひ一度のぞいて見てください。
開発できるようになりますよ?!

関連記事


Comments

Leave a Comment


Body