Effective Object-C 读书笔记

OC 使用“消息结构”(messaging structure)而非“函数调用”(function calling)。
OC 由Smalltalk 转化而来,后者是消息型语言的鼻祖。

消息与函数调用的区别在于:
  • 消息结构的语言,运行时所执行的代码由运行环境所决定,消息调用的时候不论是否多态,总是在运行时才会查找索要执行的方法。实际上,编译器甚至不关心接收消息的对象是何种类,接收消息的对象问题也会在运行时处理,其过程叫做“动态绑定”(dynamic binding)
  • 使用函数调用的语言,运行时所执行的代码则由编译器决定。
    如果函数调用是多态的,那么运行时就需要按照“虚方法表”(virtual table)来查出到底应该执行哪个函数实现。

那么什么是虚方法表呢?
虚方法表是编程语言为实现“动态派发”(dynamic dispatch)或者运行时绑定(runtime method binding)而采用的一种机制。

Objective-C 的重要工作都由“运行期组件”(runtime component)而非编译器完成。使用Objective-C的面相对象所需的全部数据结构及函数都在运行期组件里面。运行期组件本质上就是一个与开发者所编写代码相链接的“动态库”(dynamic library),其代码能把开发者编写的所有程序粘合起来。

OC的指针是用来指示对象的,声明一个变量,令其指代某个对象:

NSString * someVariable = @"the string"

上面的代码中,变量someVariable是一个类型为 NSString * 的指针,指向对象 @"the string"

NSString * a = @"str"
NSString * b = a

上面代码中指针a,b均指向同一个内存地址:@"str" 的内存地址

OC 为C语言添加了面相对象特性,是其超集。

OC 中对象所占内存总是分配在“堆空间”(heap space)中,而绝不会分配在“栈”(stack)上。
分配在堆中的内存必须直接管理,而分配在栈中用于保存变量的内存则会在其栈桢弹出时自动清理。

除非必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合。

有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。

你可能感兴趣的:(Effective Object-C 读书笔记)