理解 “类对象” 的用意
类对象并非在编译器就绑定好了,而是在运行期查找。
Objective-C的对象的本质是什么?
每个Objective-C的对象实例都是指向某块内存数据的指针。所以声明时,类型后面要跟一个 “*” 号
|
|
编过C语言的人都知道这是什么意思,对于没有写过C语言的程序员来说,pointerVarible可以理解成为存放内存地址的变量,而NSString自身的数据就存在与那个地址中。因此说可以说,pointerVarible改变量“指向”(point)NSString实例。所有Objective-C对象都是如此,若是想把对象所需的内存分配到栈上,编译器则会报错
|
|
对于通用的对象类型id,由于其本身已经是指针了,所以我们能够这样写:
|
|
上面这种定义方式和NSString* 来定义相比,其语法意义相同。唯一的区别在于,如果声明时指定了具体类型
,那么在该类实例上调用其所没有的方法时,编译器会探知此情况,并发出警告信息。
描述Objective-C对象所用的数据结构定义在运行期程序库的头文件里,id本身也定义在这里:
|
|
由此可见,每个对象的首个成员是Class类的变量。改变量定义了对象所属的类,同常称之为“isa”指针。例如刚才的例子中的对象
“是一个”(isa)NSString,所以其“isa”指针就指向了NSString。Class对象也定义在运行期程序库的头文件中:
|
|