昨天早上,看了面试题方面资料。一方面为了补一些基础,一方面试图去看ios开发方面那些会比较重点。对于初学ios,我个认为会是这样子。入门的时候很兴趣,天天想着苹果.到基础不好,疯狂开始补基础,出现浮躁,无助。下一阶段,突破到提高。 昨天看了一些runtime 方面的资料,感觉oc设计上,这部分会很抽象,但是很实用,对于小白的我看着也很费劲。当初为什么不懂 oc 的调用方法 叫消息发送。而我们平时就叫方法调用 或者函数调用。oc 底层上做了一下操作。会转换objc_msgSend 调用,帮你实现函数的调用。这里过程涉及到类的数据结构和NSObject的基础设计。
讲到这部分十分实用。
类的结构体。这里的设计十分有用。可以理解为这是一个类的描述信息。有了这些信息后。可以干些什么?我可以找到类名,知道我继续的父类是谁?内存空间大小,方法名、版本信息等等。而oc利用了这种设计,会识别到我们的类从而帮我们去在底层实现了过程。
struct objc_class { struct objc_class super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list **methodLists; struct objc_cache *cache; struct objc_protocol_list *protocols; };
讲到NSObject的设计,核心的设计很多。继承了这个NSObject的类后,每一个类都持有isa的信息,相当于一个身份识别。oc通过这个类结构体 就可以找到每一个类,从而帮你调用方法。oc 的函数概念很模糊 ,oc 的调用方法的时候,并不在编译过程告诉编译器。而是 在运行时才去做这件事。通过发送一条消息,转换查找methodLists的里对应的方法。帮助我们实现方法调用的过程。
oc 也涉及到多态。例如动态类型、动态识别,动态绑定、动态加载
动态类型,与静态类型区分是静态类型编译的时候就能识别出来。如内置的NSString 编译过程就知道对错,动态类型则在运行时(runtime)识别。他们分水岭就是编译时和运行时
动态识别(动态类型,编译时不被识别,需要运行时才识别出来,靠什么知道调用的是谁?NSObject 为我们提供身份识别器。)
动态绑定(SEL,IMP。oc 通过方法唯一的ID,去动态调用)
动态加载(暂时不了解)