什么时候在变量定义中使用*(在Objective-C中)?

Ron*_*Ron 2 cocoa declaration object objective-c

我仍然对Objective-C感到困惑.有时您会声明一个变量:

NSRect rect;
Run Code Online (Sandbox Code Playgroud)

有时是这样的:

NSValue *value;
Run Code Online (Sandbox Code Playgroud)

我永远不知道何时添加*,到目前为止我总是在Apple的文档中查找它.我知道值和指向对象的指针之间的区别.

但是,当我声明一个值并且当我声明一个指针时,是否有任何硬性规定?什么让它更容易记住?或者我必须知道(例如,查找)哪个NSSomething是值,哪个是对象?

谢谢!

wip*_*lar 5

如果变量是指向对象的指针,则使用*.一个例外id(具有隐含的*).喜欢的东西NSRectNSRange只是围绕结构基本C变量包裹.

您不一定能够分辨出未知的NS____是什么,但是如果不查阅文档并找出如何使用它,您就不会真正想要使用它.只要你理解它背后的规则,我就不会太担心它 - 你很快就会发现它是哪些东西.


Ole*_*ann 5

简短而简单:是的,你必须为每种类型记住这一点,但一段时间后它会非常自然地出现.

问题不在于"哪个NSSomething是一个值,哪个是一个对象"(更准确地说:哪个NSSomething是标量数据类型或结构,哪个是类).即使您不会看到或使用如下声明:

NSRect *pointerToARect;
NSInteger *pointerToAnInteger;
Run Code Online (Sandbox Code Playgroud)

很多时候,它们有时是非常有效和必要的.因此对于标量(简单的数据类型,如NSInteger)和结构,两种变体都是有效的,您使用哪种变量取决于您是否需要指针或实际的东西.

对于对象,所有变量必须始终是指针,因为对象只能在堆上分配,而不能在堆栈上分配.所以与上面的例子不同,这个:

NSValue myValue; // invalid!
Run Code Online (Sandbox Code Playgroud)

是不正确的,不会编译.