我正在学习Objective-C,我对一个类的实例和一个对象之间的区别感到困惑 - 它们是否相同?
以下是一个例子:
NSString *name = [[NSString alloc]initWithString:@"Harry"];
*name
是指向NSString
类的指针。 @"Harry"
是字符串的值。那么来自name
类的NSString
是一个对象,还是name
被称为类的实例?
第一类的另一个例子:
Rectangle *rect = [[Rectangle alloc]init];
所以*rect
是一个指针。 rect
是一个对象还是一个类的实例?
答案 0 :(得分:4)
在ObjectiveC中,类的实例始终是一个对象。对象始终是类的实例。 “对象”是类的一个实例,一个类在链的某个地方最终继承自NSObject
。声明没有超类的类时,NSObject
是隐式超类。
NSString *name = [[NSString alloc] initWithString:@"Harry"];
name
是指向对象的指针,更具体地说,它是NSString
的实例,其值为“Harry”。所有NSString都是对象。
Rectangle *rect = [[Rectangle alloc] init];
同样在这里。 rect
是指向对象的指针,该对象是Rectangle
的实例。
答案 1 :(得分:3)
所以
*rect
是一个指针。rect
是一个对象还是一个类的实例?
两者都是。一个类的实例也是一个对象,正如我刚刚吃完的McIntosh是“类”Apple的一个实例,也是一个水果。
“对象”是编程结构的通用术语,它保留一些状态(其实例变量)和(通常)可以执行影响该状态(其方法)的操作。类的实例是特定的对象。
在Objective-C中,通过指针访问对象;这只是你与他们互动的机制。严格地说,对象本身和指向对象的指针是不同的:rect
是指向对象的指针,类Rectangle
的实例,但在日常用语中,你可能会看到人们在谈论它们同样的方式:rect
是Rectangle
。
答案 2 :(得分:2)
指针不是对象。它只是内存中分配(存储)对象的地址。因此,它指向对象。指针实际上是一个C语言结构,Objective-C继承(原谅双关语)。 Julius是正确的,你会听到它们互换使用,技术上“rect”是实例/对象,“*”传达指针。
答案 3 :(得分:1)
感谢您的所有答案,但我仍然有点困惑。所以我们说* rect只是一个指针。 rect是Object(它是Rectangle类中的一个实例)。内存分配给rect。
@pete是的,你说得对。