0

Apple の Programming With Objective-C ガイドを使用して、Objective-C 2.0 を独学しています。

暗黙的に作成されたポインターであると私が信じているものについて質問があります。

サンプル コードを書き直すとしたら、次のようになります。

@implementation XYZShoutingPerson
- (void)saySomething:(NSString *)greeting {
    NSString *uppercaseGreeting = [greeting uppercaseString];
    [super saySomething:uppercaseGreeting];
}
@end

なので

@implementation XYZShoutingPerson
- (void)saySomething:(NSString *)greeting {
    [super saySomething:[greeting uppercaseString]];
}
@end

新しい NSString オブジェクトへの暗黙的に作成されたポインターを受け取ることになりますか?もしそうなら、ポインターのスコープはどうなりますか?

あるアプローチが他のアプローチよりも優れていると考えられますか?

4

1 に答える 1

0

書き直されたコードは、元のコードと本質的に同じです。はい、からポインターを受け取ります[greeting uppercaseString]。そのスコープは saySomething メソッドと言えます。uppercaseString によって返される文字列の保持カウントは 1 で、自動解放されます。元のコードとバージョンの両方で、[super saySomething:]がその引数を保持しない限り (可能性は低い)、autorelease プール スタックの現在のフレームがポップされると、uppercaseString の結果が解放され、割り当てが解除されます。実用的な目的で (独自の自動解放プールを管理している場合を除く)、これは、uppercaseString の結果がイベント ループの現在のターンの最後に割り当て解除されることを意味します。

コンパイラは (特に ARC を使用している場合) 十分に賢く、uppercaseString の結果が[super saySomething:]返されるとすぐに割り当てを解除します。繰り返しますが、これは両方のバージョンのコードで同じであり、その理由は、uppercaseString の結果が[super saySomething:]戻り後に使用されないためです。

于 2013-03-19T16:30:20.023 に答える