1

可能重复:
客观语言中的指针有什么意义

我对何时以及为什么在 Obj-C 代码中使用指针感到困惑。我是 Obj-C 的新手,并且从我大学的入门课程中获得了 C++ 的良好基础。

NSDate *now = [NSDate date];

为什么在这里使用指针(以及它的目的到底是什么?),而不是在这里......

NSUInteger arrayLength = [<some array> count];

我对第二个例子更满意,但第一个例子仍然让我感到困惑。

4

2 回答 2

4

令人困惑的是Apple的typedef的措辞。

NSUInteger

只是一种幻想typedefunsigned int因此它是标量类型而不是对象;对于这样一个简单的用例,您通常不需要指向它的指针。

然而,

NSDate

是基础课程;这意味着它的实例是正确的 Objective-C 对象。您可能知道,Objective-C 是一种完全动态的语言:不允许类的静态实例,因此每个对象本质上都是一个指针(嗯,而不是指针后面分配的内存)。所以当你使用 Objective-C 对象时,你总是需要一个指向它们的指针。

于 2012-07-18T18:42:30.987 回答
0

嗯,Objective-C 和 C++ 之间有一些根本的区别。在 Objective-C 中,实际上有一个“通用对象”(类型“id”),你可以传递对象而不用担心类。

使这成为可能的实现细节之一是 Objective-C 没有“静态”对象。所有对象都是通过“new”等价物创建的,并通过指针访问(字符串文字可能不同,但它们仍然是“NSString*”类型)。这就是它在 Objective-C 中的方式;你根本不能有一个“NSString MyString”。

正因为如此,整个“对象只是对象,编译器实际上并不是你正在处理的东西”是可能的,因为所有对象都只是简单的指针——它们都是相同的大小。编译器可以在不知道它们是什么的情况下传递它们,您可以将它们存储在容器中而容器不知道它们是什么等。

Objective-C 和 C++ 可能都是 C 的“面向对象”扩展,但它们仍然完全不同。

编辑:您可以编写诸如“NSString* MyString”之类的东西,以便编译器知道它正在处理什么样的对象,但这只是方便:您仍然可以将其他对象放入该指针中(事实上,因为“new”等效通常返回 id,我犯的一个更常见的错误是“新建”一个与指针所说的不同的类)从积极的方面来说,如果您将 NSWindow* 分配给 MyString,编译器会警告您,并且它如果您在 MyString 上调用“open”,也会警告您。然而,这只是编译器的一个额外好处;您也可以将所有内容声明为“id”,或者丢弃警告。

于 2012-07-18T18:47:50.760 回答