2

我正在学习Objective-C,我对类的实例和对象之间的区别感到困惑——它们是一样的吗?

这是一个例子:

 NSString *name = [[NSString alloc]initWithString:@"Harry"]; 

*name是指向NSString类的指针。@"Harry"是字符串的值。那么是name来自NSString类的对象还是被name称为类的实例?

我做的另一个例子:

  Rectangle *rect = [[Rectangle alloc]init];  

*rect指针也是如此。是rect对象还是类的实例?

4

4 回答 4

4

在 ObjectiveC 中,类的实例始终是对象。并且对象始终是类的实例。一个“对象”是一个类的一个实例,这个类在链的某个地方最终继承自NSObject. 当你声明一个没有超类的类时,NSObject就是隐式超类。

NSString *name = [[NSString alloc] initWithString:@"Harry"]; 

name是一个指向对象的指针,更具体地说,它是一个NSString具有“Harry”值的实例。所有 NSString 都是对象。

Rectangle *rect = [[Rectangle alloc] init];

同样在这里。 rect是一个指向对象的指针,它是 的一个实例Rectangle

于 2012-04-24T22:31:11.427 回答
3

*rect指针也是如此。是rect对象还是类的实例?

两者兼而有之。一个类的实例也是一个对象,就像我刚吃完的麦金托什是“类”苹果的一个实例,也是一个水果。

“对象”是保持某种状态(其实例变量)并且(通常)可以执行影响该状态(其方法)的编程结构的通用术语。类的实例是特定的对象。

在 Objective-C 中,对象是通过指针访问的;这只是您与他们互动的机制。严格来说,对象本身和指向对象的指针是不同的:rect是指向对象的指针,是 class 的实例Rectangle,但在日常语言中,你可能会看到人们以同样的方式谈论它们:rectis a Rectangle.

于 2012-04-24T22:29:02.473 回答
2

指针不是对象。它只是内存中分配(存储)对象的地址。因此,它指向对象。指针实际上是一种 C 语言结构,Objective-C 继承了它(请原谅双关语)。Julius 是正确的,您会听到它们可以互换使用,技术上“rect”是实例/对象,“*”表示指向。

于 2012-04-24T22:42:37.147 回答
1

感谢您的所有回答,但我仍然有点困惑。所以我们说 *rect 只是一个指针。rect 是 Object(它是 Rectangle 类的一个实例)。内存分配给rect。

@pete 是的,你说得对。

于 2012-04-25T01:01:55.450 回答