2012-07-20 101 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將自動釋放時超出範圍。