2015-11-02 59 views
3

根據蘋果的objective-c文檔,NSObject使用C指針來跟蹤它們。我對iOS相當陌生,並且將NSObject上的指針操作與C指針進行比較會讓人困惑。 例如:Objective-C/NSObject指針與C指針相比

NSString *string1 = @"This is a string"; 
NSString *string2; 
string2 = string 1; 

在C,(糾正我,如果我錯了,請)此= B/W 2個指針使得它們指向同一個「指針對象」。這意味着改變string1也應該改變string2。但它似乎並沒有像這樣工作,並且NSStrings無論如何都是不可改變的,所以這增加了一些混淆。

string1 = @"new string"; 

如果這些指針像C的指針操作,不是不應該這樣改變字符串2,因爲它指向同一個地方字符串1。另外,在C中,必須先將指針分配給指針,然後才能解除引用。此規則似乎不適用於NSObject。什麼是'@'在做什麼?最後,爲什麼不讓我曾經看到NSObjects發生像提領:

*string1 = @"modifying the string"; //shouldn't this be how to access the contents of the pointer string1 if it operates like a c pointer? 

有人能闡明什麼是Objective-C的指針引擎蓋下正在進行一些光,以及他們如何比較和對比C指針?任何幫助將不勝感激。

+0

更改一個字符串字符串的const char []'在C中是未定義的行爲(我也非常確定在Objective-C中)。那麼有什麼意義呢? – Olaf

回答

5

您將獲得在C相同的行爲在Objective-C:如果你這樣做

char *a = "hello"; 
char *b = a; 
b = "world"; 

然後a是不會改變的。當對象爲mutable時,由多個指針指向的通用對象所做的更改將變爲可見。無論NSString也不C字符串文字是可變的,所以讓我們構建一個不同的例子:

NSMutableString *string1 = [NSMutableString string:@"This is a string"]; 
NSMutableString *string2; 
string2 = string1; 
NSLog(string1); 
NSLog(string2); 
[string1 appendString:@" (a very long one!)"]; 
NSLog(string1); 
NSLog(string2); 

現在string2「看」到string1所做的更改,因爲對象是可變的。

C中的一個類似的例子是這樣的:中,是C指針

char[] a = "hello"; 
char b = a; 
printf("%s %s\n", a, b); 
strcpy(b, "world"); 
printf("%s %s\n", a, b); 
2

Objective-C的指針不 「像C指針操作」。

Objective-C中的對象始終基於堆棧。在封面下,對象的空間是通過調用C函數calloc(或類似的東西)創建的。

在表達式

NSString *aString = @"this is a string"; 

@基本上是語法糖,其限定在編譯時定義一個新的不可變的NSString恆定。

代碼

NSString *string1 = @"This is a string"; 
NSString *string2; 
string2 = string1; 

事實上確實導致兩個字符串1和字符串指向相同的內存地址。

@ dasblinkenlight的優秀答案(投票)顯示瞭如何使用可變字符串來說明更改1個字符串,該字符串指向2個地方,然後看到在這兩個地方反映的結果。

+1

謝謝,所以發生了什麼,然後當我把string1設置爲不同的東西像str1 = @「這是一個不同的字符串」;這是否會創建一個新的字符串對象並更改字符串1指向的位置?因爲如果它們指向內存中的同一個地方,那麼改變str1應該改變str2,我猜不可能NSStrings的行爲有所不同 – andypf

+0

是的。 @「」構造在編譯時創建一個新的靜態NSString對象。 'str1 = @「這是一個不同的字符串」'''str'到新定義的字符串。您可以通過將其轉換爲無符號長整型並在NSLog中使用「%X」格式字符串來記錄對象的地址。我建議你做一些測試,記錄字符串的地址,當你做任務時,看看發生了什麼。 –