0

我正在尝试从 iTunes U iPhone 编程讲座中学习。

关于以下方法代码,我有一个问题:

+(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 回答