2011-12-27 12 views
0

私は以前のバージョンのiOSでプログラミングしていましたが、iOS 5とARCでは初めてでした。私は明示的にバックボタンを解放する必要がありますARCでこのUIBarButtonItemのメモリを適切に管理するにはどうすればよいですか?

UIBarButtonItem *backbutton = [[UIBarButtonItem alloc] initWithTitle:@"Bill" 
          style:UIBarButtonItemStyleBordered 
          target:nil 
          action:nil]; 
self.navigationItem.backBarButtonItem = backbutton; 

以前のiOSバージョンでは:

は、私は次のコードを持っています。 iOS 5では、これがどのように行われているのか不思議です。このコードは、View Controllerの「viewDidLoad」メソッドにあります。

+0

ARCを使用している場合は、Objective-Cオブジェクトのメモリ管理上の問題について心配する必要はありません。 –

+0

私はあなたがARCを使用していると仮定しています。オブジェクトを解放することを本当に楽しむなら、いつでもARCをオフにすることができます。 – DGund

答えて

4

ARCを使用しているため、ボタンを放すために何もする必要はありません。自動的に解放されます。 ARCはすべてを解放する必要がないように作られました。 Xcodeコンパイラによって処理されます。

+1

+1。さらに、OPの例の一時的な 'backbutton'変数を完全に余分にして、行全体を節約します。非常にすばらしい。 –

1

私はあなたがARCの下でリリース/保持できると言って間違っていたため編集されました。それはいけません。これは良い説明です: Some questions about Automatic Reference Counting in iOS5 SDK

+1

ARCでコンパイルされたコードをrelease、retain、またはautoreleaseすることはできません。 –

+0

あなたは絶対に正しいです!私はこの現在のプロジェクトでARCを無効にしたことを完全に忘れてしまった!私はまだリンクが非常に記述的だと思うが。 –

+0

お返事ありがとうございました。感謝します。 – banditKing

2

iOS 5は、保持カウントを使用してオブジェクトを解放し、オブジェクトが参照されなくなったときにオブジェクトを解放することで、メモリ管理を実行します。 ARCの前に、iOSのメモリ管理はすべての実行時の可能性(悲惨なもの)をカバーするためにプログラマーだけに依存していました。 .NETやOS Xなどの他の環境では、参照されていないオブジェクトの保持カウントを定期的にゼロに設定しています。この「ガベージコレクション」の実行時システムは、予期せず実行を遅くします。 ARCは、私が知る限り、メモリ管理の最初の解決策であり、コンパイラ(素晴らしい)を使用して、すべての可能な実行パスの静的解析によって完全に実行されるという点でユニークです。

基本的には、コンパイラは、,retainまたはautoreleaseステートメントを透過的に挿入します。理論的には、[NSString stringWithString]などのファクトリメソッドで作成されたオブジェクトは、[[NSString alloc] initWithString]によって作成されたオブジェクトと同じ寿命を持ちます。 LLVMコンパイラがallocのオブジェクトを別の方法で扱っているかどうかは誰にも分かりますか?

+0

+1あなたの2つの例は、LLVMがそれらを使って完了した後に異なる場合があります。前者は(一般的に) 'objc_retainAutoreleasedReturnValue()'を呼び出しますが、後者はそうではありません。これは最適化の詳細ですが、コードを作成することはお勧めしません。 ARCは非常にスマートで非常に速く、あなたはそれを考え直すべきではありません。少し深めたいのであれば、http://clang.llvm.org/docs/AutomaticReferenceCounting.htmlを参照してください。もちろん、シンプルなプログラム用のアセンブラ出力を生成し、それが自分自身で何をしているかを見ることもできます。 –

+0

clang-ARCリンクに感謝します。それは、アプリ開発側の人々にとって非常に明らかです。それはブロックポインターを合理化しています。 ARCセーフティネットを持っていることを知っているだけで、ARC前の方法でallocとautoreleaseイニシャライザを使い続けるのは合理的な方法です。 –

関連する問題