2010-12-29 17 views
2

私はちょうどiPhone用に開発を始め、メモリ管理について頭を悩ませようとしています。私は地図上に地図と注釈を表示する小さなプログラムを作った。アノテーションのために、私はMKAnnotationプロトコルを実装するシンプルなクラスを作成しました。私は、オブジェクトを解放しようとするまでそれがうまく働いたポインタのないオブジェクトを解放しますか?

[self.myMapView addAnnotation:[[MyAnnotation alloc] init]]; 

:私はこれを書いた注釈を作成して追加するには

。解放するものはない。これは私がC#で行ったことですが、ガベージコレクションなしでは動作しないと思いますか?

これはこれを行う唯一の方法ですか?

MyAnnotation *myAnnotation = [[MyAnnotation alloc] init]; 

[self.myMapView addAnnotation: myAnnotation]; 

[myAnnotation release]; 

答えて

8
[self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]]; 
+0

申し訳ありません申し訳ありません。私はまだこれに苦しんでいます、あなたの答えは私が行くものです。私はもう一度この質問を投稿しましたが、今度はメモリリークに焦点を当て、あなたと同じ答えを得ました。 –

1

はい、それはこのような状況を処理するために認められた方法です。 codelarkの答えのようにautoreleaseと呼んでもいいかもしれませんが、iPhoneの限られたメモリ環境では、自動リリースは時々問題が発生することがあります。可能であれば、自動解放を避けることは良い習慣です。

+1

「可能であれば、自動解放を避けるのは良い方法です」 - 私は同意しません。これは、数百または数千のオブジェクトを一度に割り当てる場合にのみ避けるべきことです。この場合、それは正しいイディオムです。 –

+1

正解(この例#2は一般的にどのように行われているか)は+1ですが、理由なしで自動解放を避けることはカーゴカルトプログラミングです。この場合、オブジェクトは、現在のイベントループを過ぎてもメモリに残っているオブジェクトによって既に保持されているので、自動解放を避けると絶対に* no *メモリが節約されます。 – Chuck

+0

批判が注目され、感謝します。私は将来この問題に関する私の声明をよりよく修飾することを覚えています。 – Endemic

0

誰もが答えに感謝します。

このコードは、私が最初に考えていたソリューションに最も似ているようです。

[self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]]; 
関連する問題