Objective-C中的星号用法

时间:2010-01-10 03:46:21

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:20)

  

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

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

本地范围中的

NSArray array;将是堆栈上“已分配”的对象。 NSArray *array;表示由大量内存支持的对象,通常从堆中分配。

很久很久以前,我们决定Objective-C不支持堆栈上的对象。大多数情况下,因为这样做会使内存管理成为一个巨大的混乱(主要是,堆栈中某些东西的-retain根本没有任何意义。)

由于Objective-C被设计为C的纯超集,并且与C ++不同,它不会尝试修改C的基本行为,因此*看起来很自然。

请注意,id会打破此问题,但id也是一种完全通用的类型。事实上,它可能在堆栈上有Objective-C对象。在Snow Leopard中,Blocks实际上是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));

答案 1 :(得分:2)

Objective-C语言从编译时间和链接时间到运行时推迟了尽可能多的决策。只要有可能,它就会动态执行诸如创建对象和确定要调用的方法之类的操作 所以,如果它允许

NSArray array = [[NSArray alloc] init];  

在一个方法中,编译器必须在编译时知道NSArray的大小。