2009-04-29 20 views
0

爲了嘗試一些指針的東西,我在現有的項目中創建了一個實例變量。這只是聲明如下:爲什麼我的實例變量表現得如此奇怪?我是否正確?

@interface PointerFun : NSObject { 
    NSString* test; 
} 

我沒有@property編譯指令,沒有@synthesize,所以沒有getter和沒有setter。只是爲了測試。

然後我有一個方法,我嘗試了一些指針和這個實例變量的東西。我真正想要檢查的是當我將該實例變量分配給一個NSString對象(或任何對象)時,以及在分配該對象之後,將另一個對象分配給指向該實例var的那個指針會發生什麼。我認爲它會改變實例var中的對象。

因此,這裏是我的代碼:

NSString *str1 = [NSString stringWithCString:"one"]; 
NSString *str2 = [NSString stringWithCString:"two"]; 

test = str2; // assign directly to instance variable (bad thing, just for testing!) 
str2 = str1; // now lets be really mean and change the object from that pointer!! 

NSLog(@"test: %x, %@", test, test); // test: 52cb10, two 
NSLog(@"str1: %x, %@", str1, str1); // str1: 52ca60, one 
NSLog(@"str2: %x, %@", str2, str2); // str2: 52ca60, one 

就像你看到的,實例變量不斷指着這是早期的背後STR2 NSString的對象。所以當我將str1分配給str2時,我將str1的值賦給str2,這是一個內存地址。所以我讓兩個指針具有相同的值,對吧?

但是,當我指定str2的值來測試時,測試接管了str2的值,該值在當時是「two」對象的內存地址。所以,即使我在賦值指針str2的值之後改變它,它也不會影響實例變量的值。並且因爲這是一個指向NSString對象的指針,所以它的行爲與str1或str2的行爲相同。沒有區別只是因爲它是一個實例var。它只是一個變量,或者更好:它只是一個指針。我有沒有得到那個權利? phew;)...希望如此!

+0

嘗試在&str1,&str2和&test上做一些日誌記錄。這將記錄變量本身的地址。我認爲這可能會讓事情更清楚。 NSLog(@「test:%x,%x,%@」,test,&test,test); – Jab 2009-04-29 16:52:04

回答

4

這三個變量實際上是指針(test,str1和str2),並且您創建了2個對象:「one」和「two」。

當你這樣做:

test = str2; 

你正在測試點的對象「兩節」,當你這樣做:

str2 = str1; 

你正在str2指向的對象「一」 ,它根本不影響測試。

相關問題