7.在对象内部尽量直接访问实例变量
速度快
不会调用“设置方法”
不会触发KVO
不方便查错
折中方案:写入实例变量时,通过“设置方法”;读取实例变量时,直接访问
提高读取速度
控制对属性的写入操作
8.理解“对象等同性”这一概念
相同的对象有相同的hash码,但hash码相同对象未必相同
11.理解objc_msgSend作用
静态绑定(static binding):在编译期就能决定运行时所应调用的函数
动态绑定(dynamic binding):所调用的函数在运行期才能确定
void objc_msgSend(id self,SEL cmd,..)
self:代表接收者
SEL:代表@selector()
...:代表消息后续参数
流程
在接收者所属的类中搜寻其“方法列表”,找到,则跳转至实现代码
找不到,沿着继承体系向上查找,找到,再跳转
还找不到,执行消息转发(message forwarding)
其他函数
objc_msgSend_stret:发送的消息返回结构体
objc_msgSend_fpret:发送的消息返回浮点数
objc-msgSendSuper:如果要给超类发消息
13.用“方法调配技术”调试“黑盒方法”
获取方法实现:Method class_getInstanceMethod(Class cls, SEL name)
交换方法实现:void method_exchangeImplementations(Method m1, Method m2)
14.理解“类对象”的用意
id:通用对象类型
如果声明时指定具体类型,在该类实例中调用该类没有的方法时,编译器会警告,而id不会
isMemberOfClass:判断对象是否为某个类的实例,不包括父类和子类
isKindOfClass:判断对象是否为某个类的实例或其派生类的实例,包括父类,不包括子类