2012-07-20 95 views
0

我正在尝试从iTunes U iPhone编程讲座中学习。ARC与非ARC removeLastObject方法

有,我在关于以下方法的代码的问题:

+(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; 
} 

如何topOfStack即使removeLastObject已经调用它仍然可以访问。在过去,removeLastObject会向已删除的对象发送一个版本,那么topOfStack如何仍然有效?我猜这是与ARC相关的,但我不确定。

回答

3

所有变量在ARC下默认都有很强的参考。虽然堆栈可能会丢失对最后一个对象的引用,但变量topOfStack仍会引用它,因此topOfStack的值不会从内存中删除。

1

在ARC中,没有限定符的所有局部变量假定为__strong引用。这意味着topOfStack是对stack的最后一个对象的强烈参考。因此它保留了它,甚至认为该对象在被移除时被数组释放。因此,topOfStack将继续有效,直到ARC将自动释放时超出范围。