2009-04-16 7 views
3

誰かが次のコードによって私のアプリケーションが爆弾を引き起こす理由を説明できますか?NSDataを解放すると例外が発生する

NSData *myImage = UIImagePNGRepresentation(imageView.image); 
    : 
[myImage release]; 

私は「解放」の行をコメントアウトした場合、アプリが実行されます...しかし、このコードを含む関数を呼び出して数回、私はクラッシュを取得する - 私はメモリリークによって引き起こされると思います。

もし私が関数の中のすべてのものをコメントアウトして、それらの2行を残しても、リリースが実行されると、アプリケーションはクラッシュします。

私は、これは「あなたが正しくあなたの混乱をクリーンアップする方法がわからない」初心者の事;-)

乾杯、

ジェイミーのようなものでなければならないと確信しています。

答えて

4

releaseに電話をしてもよろしいですか?MacOS APIの一般的なルールは、所有権を譲渡するメソッドの名前がCopyまたはCreateであることです。コピーではなく、基礎となるイメージ表現への参照が与えられていると思われます。その場合は、他のものが所有するオブジェクトを解放しています。

+0

はい - あなたは正しいです...私はちょうどコードをもう一度やって、コードをコメントアウトしてステップバイステップで実行しています...私はそれをリリースしてはいけません!ありがとう - これは私がこの問題を解決するのを助けました。私が考えている本をもう少し読んでくれる時間:-( – badmanj

+0

メソッドの場合、単語は 'alloc'、' new'、 'copy'(もちろん' retain')です。あなたはCore Foundationを考えていますとにかく、ここではメモリ管理ルールへの義務的なリンクがあります:http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –

4

メモリ管理については、ここでいくつかのスレッドを見つけることができます。this pageをご覧ください。私はここですべてのルールに入ることはしませんが、基本的な問題は、myImageがオートレリースされ、保持されないということです。手動でリリースを呼び出すと、retainとペアになっていないので、autoreleaseが(現在無効な)実行ループの最後にアプリケーションがクラッシュします。リリースを削除すると問題は解決しますが、保持ルールまたはリリースルールを知るには少し時間を費やしますが、これは理解するために最も重要なことの1つです。

+0

ありがとうございます - 私は問題をもう少し詳しく読んでいきます - 問題は私の基本的な理解です。 – badmanj

0

このオブジェクトを解放しないでください。 Appleは述べている:「データを生成する問題があった場合の戻り値 データPNGデータを含むオブジェクト、またはnilを自動解放しました。」 (UIImagePNGRepresentation referenceを参照してください)

関連する問題