c - 星号在 Objective-C 中的使用

标签 c objective-c pointers objective-c-runtime

我有一个关于在 Objective-C 中使用星号的问题。明确一点:我了解指针是什么以及程序 C 中的所有内容。不过我想知道两件事:

1) 为什么所有(对)Objective-C 对象都是指针?为什么不是普通变量? (即 NSArray array = [[NSArray alloc] init];)

2) 为什么在调用方法时省略星号?

谢谢!

最佳答案

1) Why are all (references to) Objective-C objects pointers? Why not plain variables? (i.e. NSArray array = [[NSArray alloc] init];)

暂时将 Objective-C 对象想象成一个美化的结构。

NSArray array; 在局部作用域中是在堆栈上“分配”的对象。 NSArray *array; 表示由一大块内存支持的对象,通常是从堆中分配的。

很久很久以前,Objective-C 就决定不支持堆栈上的对象。大多数情况下,因为这样做会使内存管理变得一团糟(主要是,-retain 堆栈上的某些内容根本没有任何意义)。

由于 Objective-C 被设计为 C 的纯超集,并且与 C++ 不同,它不会尝试修改 C 的基本行为,因此在其中添加 * 似乎很自然。

请注意 id 打破了这一点,但 id 也是一个完全通用的类型。事实上,在堆栈上有 Objective-C 对象是可能的。在 Snow Leopard 中, block 实际上是 Objective-C 对象,它们确实从堆栈开始。但是,不支持您在堆栈上创建自己的对象。

2) Why do you omit the asterisk when calling method?

因为您没有取消引用指向对象的指针,并且指向对象的指针在方法实现本身中是至关重要的。当你说...

[anArray objectAtIndex: 5];

... 完全等同于写...

objc_msgSend(anArray, @selector(objectAtIndex:), 5);

...当您实现上述方法时...

- (id) objectAtIndex: (NSUInteger) anIndex;

...完全等同于实现这个C函数...

id object_at_index(id self, SEL _cmd, NSUInteger anIndex) { ... }

也就是说,Objective-C 方法实际上只是一个接受两个或更多参数的 C 函数。事实上,您可以将这行代码粘贴到任何方法实现中,它就会“正常工作”:

NSLog(@"method %@", NSStringFromSelector(_cmd));

关于c - 星号在 Objective-C 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2035994/

相关文章:

c - 如何制作一个while循环而不让屏幕闪烁

cmake 忽略 -D CMAKE_BUILD_TYPE=Debug

ios - 我们什么时候在 Objective-C 中使用 static __unsafe_unretained?

c - 了解 C 中的内存所有权模型

pointers - Go 中的临时地址?

C 相同输出不同结果

c - 免费二维数组。静态指针

objective-c - objc 结构数组到 swift 数组

ios - UIWindow 无法填满新设备的屏幕?

c - 如何将 1D char 转换为 2D int 数组并将其传递给 int C?