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 を使用してコンパイルすると、(私が理解できるように) アセンブリには、2 番目のメソッドの最初と最後に呼び出しが含まれていobjc_retain
ましobjc_release
た。どうしたの?
これは大きな問題ではありませんが、Instruments を使用してパフォーマンスが重要なコードをプロファイリングすると、この余分な保持/解放トラフィックが発生します。3 番目の例で行ったように、この余分な保持/解放を避けるためにメソッドの引数を で装飾できるようですが__unsafe_unretained
、そうすると非常にうんざりします。