2012-05-30 214 views
2

在這裏使用一個基本的目標c示例,試圖使用replaceObjectAtIndex爲一個數組,它似乎並沒有工作。replaceObjectAtIndex似乎沒有工作

我的代碼:

NSMutableArray *myArray=[NSMutableArray array]; 
    [myArray addObject:@"First string"]; 
    [myArray addObject:@"Second string"]; 
    [myArray addObject:@"Third string"]; 

    NSString *newElement=[myArray objectAtIndex:1]; 
    NSLog(@"New object at index 1 BEFORE is %@", newElement); 
    [myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 
    NSLog(@"New object at index 1 AFTER is %@", newElement); 

理論上輸出爲newElement現在應該顯示 「Hello」,但它仍然顯示 「第二個字符串」

輸出:

2012-05-30 11:21:16.638 cocoa lab[753:403] New object at index 1 BEFORE is Second string 
2012-05-30 11:21:16.641 cocoa lab[753:403] New object at index 1 AFTER is Second string 

請告知

謝謝

回答

5

你需要替換它

// ... 
[myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 

/* ADD THIS */ 
newElement=[myArray objectAtIndex:1]; 

NSLog(@"New object at index 1 AFTER is %@", newElement); 

在你獲取原始字符串,更換陣列的對象,然後再打印出原始字符串後瞬間擺脫數組新的價值。

+1

嗯,認爲爲newElement是一個指針數組的元素1,所以當該元素得到了改變,爲newElement將反映它。可能不會。感謝你的回答。 – Live2Enjoy7

+0

C樣式陣列按照您描述的方式工作。指向數組的指針只是指向第一個元素的指針,然後可以添加元素大小的一些倍數,以獲取指向數組下方的元素的指針。目標C'NSArray's是另一方面的對象。數組中的元素也是對象。所有的指針都指向實際的對象,而不是數組中的某個佔位符。 –

+0

@ Live2Enjoy7'newElement'是一個局部變量,它包含一個指向對象的指針。如果不重置指針指向某個其他對象,它仍然指向原始對象。 – jlehr

0

你需要調用replaceObjectAtIndex:後的newElement值復位,所以記錄的值的第二時間前添加另一行:

newElement=[myArray objectAtIndex:1]; 

更新1

而且不心疼 - - 我們都曾經這樣或那樣做過自己。 :-)

更新2

順便說一句,爲了避免這種問題,一般一個好方法是在使用這些種情況分別局部變量,例如習慣得到,你可以重寫你貼的代碼如下:

NSString *initialValue = [myArray objectAtIndex:1]; 
NSLog(@"New object at index 1 BEFORE is %@", initialValue); 

[myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 

NSString *newValue = [myArray objectAtIndex:1]; 
NSLog(@"New object at index 1 AFTER is %@", newValue);