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是值,哪个是对象?
谢谢!
如果变量是指向对象的指针,则使用*
.一个例外id
(具有隐含的*).喜欢的东西NSRect
而NSRange
只是围绕结构基本C变量包裹.
您不一定能够分辨出未知的NS____
是什么,但是如果不查阅文档并找出如何使用它,您就不会真正想要使用它.只要你理解它背后的规则,我就不会太担心它 - 你很快就会发现它是哪些东西.
简短而简单:是的,你必须为每种类型记住这一点,但一段时间后它会非常自然地出现.
问题不在于"哪个NSSomething是一个值,哪个是一个对象"(更准确地说:哪个NSSomething是标量数据类型或结构,哪个是类).即使您不会看到或使用如下声明:
NSRect *pointerToARect;
NSInteger *pointerToAnInteger;
Run Code Online (Sandbox Code Playgroud)
很多时候,它们有时是非常有效和必要的.因此对于标量(简单的数据类型,如NSInteger)和结构,两种变体都是有效的,您使用哪种变量取决于您是否需要指针或实际的东西.
对于对象,所有变量必须始终是指针,因为对象只能在堆上分配,而不能在堆栈上分配.所以与上面的例子不同,这个:
NSValue myValue; // invalid!
Run Code Online (Sandbox Code Playgroud)
是不正确的,不会编译.