0

私はiTunesUiPhoneプログラミングの講義から学ぼうとしています。

次のメソッドコードに関して私が持っている質問があります:

+(double) popOperandOffStack:(NSMutableArray *) stack{
    double result = 0;

    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];

    if ([topOfStack isKindOfClass:[NSNumber class]]){
        result = [topOfStack doubleValue];
    }
    else if ([topOfStack isKindOfClass:[NSString class]]){

        if ([topOfStack isEqualToString:@"+"]){
            result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"-"]){
            result = [self popOperandOffStack:stack] - [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"*"]){
            result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"/"]){
            result = [self popOperandOffStack:stack] / [self popOperandOffStack:stack];
        }


    }

    return result;
}

removeLastObjectがすでに呼び出されている場合でも、topOfStackにはどのようにアクセスできますか。以前は、removeLastObjectは削除されたオブジェクトにリリースを送信していましたが、topOfStackはどのように有効ですか?これはARCに関連したものだと思いますが、よくわかりません。

4

2 に答える 2

3

ARCでは、デフォルトですべての変数に強い参照があります。スタックは最後のオブジェクトへの参照を失う可能性がありますが、変数topOfStackは引き続きそれを参照するため、topOfStackの値はメモリから削除されません。

于 2012-07-20T22:42:31.070 に答える
1

ARCでは、修飾子のないすべてのローカル変数が__strong参照であると見なされます。これtopOfStackは、の最後のオブジェクトが何であったかを強く参照していることを意味しますstack。したがって、オブジェクトが削除されたときに配列によって解放されたとしても、それは保持されます。したがってtopOfStack、ARCが自動的にリリースするときにスコープから外れるまで、有効であり続けます。

于 2012-07-20T22:43:44.017 に答える