【发布时间】:2009-04-29 16:35:13
【问题描述】:
为了尝试一些指针的东西,我在现有项目中创建了一个实例变量。它只是这样声明的:
@interface PointerFun : NSObject {
NSString* test;
}
我没有@property 编译器指令,没有@synthesize,所以没有getter 和setter。只是为了测试。
然后我有一个方法,我用指针和这个实例变量尝试一些东西。我真正想检查的是,当我为该实例变量分配一个 NSString 对象(或任何对象)时会发生什么,并且在分配对象之后,将另一个对象分配给我分配给实例 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 的值分配给 test 时,test 接管了 str2 的值,当时它是“two”对象的内存地址。因此,即使我在分配后更改了指针 str2 的值,它也不会影响实例变量的值。因为这是一个指向 NSString 对象的指针,所以它的行为与 str1 或 str2 相同。没有区别,因为它是一个实例变量。它只是一个变量,或者更好:它只是一个指针。我做对了吗?唷 ;) ...希望如此!
【问题讨论】:
-
尝试登录 &str1,&str2,&test。这将记录变量本身的地址。我认为这可能会让事情变得更清楚。 NSLog(@"test: %x, %x, %@", test, &test, test);
-
谢谢!我尝试过这个。效果很好!
标签: c objective-c pointers