【问题标题】:Why does my instance variable behave so strange? Did I get it right?为什么我的实例变量表现得如此奇怪?我做对了吗?
【发布时间】: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


【解决方案1】:

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

当你这样做时:

test = str2;

你正在为对象“二”制作测试点,当你这样做时:

str2 = str1;

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

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 2021-10-11
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2018-07-21
    • 2018-09-09
    相关资源
    最近更新 更多