iPhone&Androidプログラミング記: UIImageを戻り値として返す時に気を付けないといけない事
英語─上達しないのは努力不足が原因ではなかった!
英語が話せない…を解決する博士開発の噂の英語教材!返品保証付!

2009年05月15日

UIImageを戻り値として返す時に気を付けないといけない事

UIImageを戻り値として返す場合、そのUIImageが「initWith〜」の形式でallocしているのは推奨されていないようです。

例えばこんな書き方。


- (UIImage*) getImageFromNumber:(int)number
{
//画像ファイルの読み込み
return [[UIImage alloc] initWithContentsOfFile:imagePath[number]];
}


なぜダメなのかということはよく分からないのですが、allocの際にretainされるので、retainされたままreturnするのは良くないよ。
という事のようです。
iPhone OS ではガーベジコレクションが採用されていないため、メモリ管理はretainとreleaseによって行われます。
なので、この辺りには気を使わないといけないです。

で、じゃあどう書けばいいんだ?という事になります。

メソッドにはallocをしながらインスタンスを作成してくれるメソッドがあります。
メソッドの前に「+」で宣言されている物です。
allocされないのは「ー」です。

UIImageについてAPIリファレンスを検索すると「+」のメソッドがあるのが分かると思います。
「imageWith〜」で始まるメソッドです。

という事で、以下の様に書くのが正しいです。


- (UIImage*) getImageFromNumber:(int)number
{
//画像ファイルの読み込み
return [UIImage imageWithContentsOfFile:imagePath[number]];
}


なかなかメモリ管理するのは大変ですが、こういった細かい部分が品質の向上につながると思うので、きっちりやっておかないといけないですね。


2009.05.18 追記
kudaraさんからのコメントの通り、以下のようにautoreleaseを付けておけば大丈夫でした。


- (UIImage*) getImageFromNumber:(int)number
{
//画像ファイルの読み込み
return [[[UIImage alloc] initWithContentsOfFile:imagePath[number]] autorelease];
}


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

Sony Style(ソニースタイル)


posted by ラキシス at 19:10 | Comment(2) | TrackBack(0) | iPhoneプログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
クラスメソッドじゃなくても
alloc init したやつを autorelease すれば大丈夫だよ。
Posted by kudara at 2009年05月16日 17:30
ご指摘ありがとうございます。
記事に追記させていただきました。
Posted by ラキシス at 2009年05月18日 13:10
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。