为了尝试一些指针的东西,我在现有的项目中创建了一个实例变量。这只是声明如下:为什么我的实例变量表现得如此奇怪?我是否正确?
@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;)...希望如此!
尝试在&str1,&str2和&test上做一些日志记录。这将记录变量本身的地址。我认为这可能会让事情更清楚。 NSLog(@“test:%x,%x,%@”,test,&test,test); – Jab 2009-04-29 16:52:04