为什么我必须在Objective-C中只编写* myPointerVar SOMETIMES?

这是一个我仍然不明白的问题。

有时我必须写:

NSString* myVariable; myVariable = @"Hey!"; 

然后,例如,我定义一个结构“DemoStruct”并获得一个使用它的变量。 假设我有一个结构,其中x和y变量来自double类型。

我想将这个var传递给一个方法然后操作我的var,我希望这个操作对我将var传递给该方法的上下文有影响。 所以我需要一个指针,对吧。

我把它传递给这样的方法:

 [someObject someMethod:&myVarThatUsesTheStruct] 

该方法现在看起来像这样:

 - (void)someMethod:(DemoStruct*)myVar { (*myVar).x += 10; } 

在调用之前,结构的组件x可以说是1000.现在,在方法调用之后添加10并且它是1010。

但我真的很难得到它为什么我必须在方法中使用Asterisk * for myVar,因为我已经在方法标题中说myVar是DemoStruct的指针。 我只是通过&myVarThatUsesTheStruct传递内存地址。

有人可以解释为什么会这样吗?

如你所说, myVar是一个指针。 因此,myVar.x不正确:它将通过指针的字段,在C / Objective-C中没有任何意义。

如果要访问指针指向的变量,则必须添加星号: myVar是指针, *myVarmyVar指向的变量。

此外,在您的情况下,您可以通过编写myVar->x来使用C的特殊构造,它严格等同于(*myVar).x

所有这些都是标准C,不是Objective-C特有的。

关于您的第一个示例,您不必添加星号,因为您更改了指针的值,而不是变量的值: myVariable是指向对象的指针,该对象在声明时被指定为nil值。 下一条指令( myVariable = @"Hey!" )是指针值的赋值: @"Hey!" 是指向NSString对象的指针。 此指针的值(不是指向常量的值)被分配给myVariable ,然后指向对象@"Hey!"

是的,这是第一次难以理解……

*是解除引用运算符。 所有* myVar意味着“让我得到指针myVar指向的东西”。 您需要这种区别,因为您需要告诉计算机您想要更改myVar指向的内容,而不是myVar本身。

通过iphone开发者的开发者门户从学习目标c链接获取:

Objective-C支持包含对象的变量的强类型和弱类型。 强类型变量包括变量类型声明中的类名。 弱类型变量使用对象的类型id。 弱类型变量经常用于诸如集合类之类的事物,其中集合中对象的确切类型可能是未知的。 如果您习惯使用强类型语言,您可能会认为使用弱类型变量会导致问题,但它们实际上提供了极大的灵活性,并允许Objective-C程序具有更大的动力。

以下示例显示强类型和弱类型的变量声明:

MyClass * myObject1; //强打字

id myObject2; //打字不好

注意第一个声明中的*。 在Objective-C中,对象引用是指针。 如果这对您没有任何意义,请不要担心 – 您不必是指向能够开始使用Objective-C编程的专家。 您只需记住将*放在变量名前面,以用于强类型对象声明。 id类型意味着一个指针。