交換用コードが間違っているため、Apple が防止しようとしている問題が示されています。コードは次のとおりです。
self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.view addSubview:[navigationController view]];
[navigationController release];
あなたは「自分」を省きました。あなたの参照で。ivar に直接アクセスするつもりだったのかもしれませんが、その場合は、アクセサーと ivar への直接アクセスを混在させて、非常に紛らわしいコードを作成してしまいました (また、アクセサーの外部で ivar への直接アクセスを使用することで基本規則に違反しました)。そうでない場合は、これを書くつもりでした:
self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.view addSubview:[self.navigationController view]];
[self.navigationController release];
その最後の行は非常に間違っています。メソッド呼び出しの結果に -release を送信しないでください。いいえ、あなたのやり方は正しくありません。
とはいえ、Apple と私はこれを行う方法について意見が分かれています。これが私がそれを行う方法です:
self.navigationController = [[[UINavigationController alloc]
initWithRootViewController:rootViewController] autorelease;
[self.view addSubview:[self.navigationController view]];
-autorelease が好きなのは、エラーを防ぐことができるからです。alloc と release が離れれば離れるほど、開発者はメモリ リークを挿入する可能性が高くなります (たとえば、"return" を追加することによって)。autorelease は、retain と release を一緒に保つことでこれを回避し、これを一時変数として使用する意図をより明確にし、一般的にコード レビューをより簡単にします。
Apple は、リリース対自動リリースを使用してパフォーマンスを強調しているため、コード例で私に反対する傾向があります。どちらの場合も、この実行ループ中にこのオブジェクトの割り当てが解除されないため (メモリが節約されないため)、これは間違った最適化であることがわかります。 release の不適切な使用によるメモリ リークの減少。
自動リリースとリリースの議論は灰色の色合いでいっぱいです (私は確かにリリースをループで直接使用しています)。開発者によってアプローチは異なりますが、どちらの場合も、置換コードは正しい方法ではありません。