为什么我的实例变量表现得如此奇怪?我做对了吗?

时间:2009-04-29 16:35:13

标签: c objective-c pointers

为了尝试一些指针,我在现有项目中创建了一个实例变量。它只是这样声明:

@interface PointerFun : NSObject {
    NSString* test;
}

我没有@property编译器指令,没有@synthesize,所以没有getter而且没有setter。仅供测试。

然后我有一个方法,我用指针和这个实例变量尝试一些东西。我真正想要检查的是当我为该实例变量分配NSString对象(或任何对象)时会发生什么,并且在分配对象之后,将另一个对象分配给我分配给实例var的指针。我认为它会将实例var中的对象更改为weell。

所以这是我的代码:

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的值赋值给test时,test接管了str2的值,即-at那个时间 - “两个”对象的内存地址。因此,即使我在该赋值之后更改指针str2的值,它也不会影响实例变量的值。因为它是一个指向NSString对象的指针,它的行为与str1或str2的行为相同。没有区别只是因为它是一个实例var。它只是一个变量,或更好:它只是一个指针。我做对了吗? phew;)...希望如此!

1 个答案:

答案 0 :(得分:4)

这三个变量实际上是指针(test,str1和str2),你创建了两个对象:“one”和“two”。

当你这样做时:

test = str2;

你正在测试对象“两个”,当你这样做时:

str2 = str1;

你正在使str2指向对象“one”,这根本不会影响测试。