ARCを使用してコンパイルする場合、メソッド引数はメソッドの先頭に保持され、最後に解放されることがよくあります。この保持/解放のペアは不要であると思われ、ARCが "とにかく書いたコードを生成する"という考え方と矛盾しています。暗闇の中の誰も、ARC前の日は、ただ安全な側にあるために、すべての方法論論に余分な保持/解放を行ったのではないでしょうか?ARCはメソッド引数を保持するのはなぜですか?
は考えてみましょう:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
をリリースモードでのXcode 4.3.2でコンパイルした場合には、アセンブリは(私はそれを理解することができるよように)の開始時と終了時にobjc_retain
とobjc_release
への呼び出しが含まれてい2番目の方法。どうしたの?
これは大きな問題ではありませんが、パフォーマンス重視のコードのプロファイリングにInstrumentsを使用すると、この余分な保持/解放トラフィックが表示されます。メソッドの引数を__unsafe_unretained
で飾ることで、この余分な保持/解放を避けることができます。これは3番目の例で行っていますが、そうすることはかなり嫌です。
最初の例でなぜそれが起こらないのでしょうか? – Thilo
分解アシスタントビューを使用して、実際に生成されたコードをいつでもチェックアウトすることができます。 – Danra