1) 为什么都是(参考)
Objective-C 对象指针?为什么不
普通变量? (即 NSArray 数组 =
[[NSArray alloc] 初始化];)
暂时将 Objective-C 对象想象成一个美化的结构。
NSArray array; 在本地范围内将是堆栈上“分配”的对象。 NSArray *array; 表示由一大块内存支持的对象,通常从堆中分配。
很久很久以前,Objective-C 决定不支持堆栈上的对象。大多数情况下,因为这样做会使内存管理变得一团糟(主要是,堆栈中的-retain 根本没有任何意义)。
由于 Objective-C 被设计为 C 的纯超集,并且与 C++ 不同,它不会尝试修改 C 的基本行为,因此在其中包含 * 似乎很自然。
注意id 打破了这一点,但id 也是一个完全通用的类型。事实上,堆栈中可能有 Objective-C 对象。在 Snow Leopard 中,块实际上是 Objective-C 对象,它们确实从堆栈开始。但是,不支持您在堆栈上创建自己的对象。
2) 为什么省略星号
调用方法?
因为您没有取消引用指向对象的指针,并且指向对象的指针在方法实现本身中至关重要。当你说...
[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));