2009-04-29 17 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指向的对象“一” ,它根本不影响测试。

相关问题