答案来源于网上,非原创,如有侵权请联系本人
1、如果让你实现属性的weak,如何实现的?
答:对于注册为weak的对象,系统会以weak指向的对象内存地址作为key,将之放入到一个hash表之中,当此对象的引用计数为0时会调用dealloc,之后遍历hash表中此key所对应的对象,将之置为nil。按照这个思路,我们可以在dealloc中手动释放weak属性,比如执行一段block,可以参照 这里。
2、如果让你来实现属性的atomic,如何实现?
答:声明为atomic的属性,系统能保证每一个get或set操作都能顺利完成。不论哪个线程调用了get或者set方法,系统会将这些操作串行执行。
假设有一个 atomic 的属性 "name",如果线程 A 调[self setName:@"A"],线程 B 调[self setName:@"B"],线程 C 调[self name],那么所有这些不同线程上的操作都将依次顺序执行——也就是说,如果一个线程正在执行 getter/setter,其他线程就得等待。因此,属性 name 是读/写安全的。
3、KVO为什么要创建一个子类来实现?
没找到答案,我觉得应该是为了不影响用户使用原有类,在用户看来没有任何不对的地方。
4、类结构体的组成,isa指针指向了什么?(这里应该将元类和根元类也说一下)
每个实例对象都包含一个isa变量,属于Class类型,Class类型==objc_class *。这个isa的指向称为类对象(就代表一个类,oc同样视为对象),包含了该实例对象所属的类的一些信息。每一个类对象又包含两个Class类型变量,分别为isa、superclass,isa指向元类对象,superclass指向父类对象。
struct objc_class {
Class isa; //指向元类对象
Class super_class;//指向父类对象
constchar *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;
}
见下图:
5、RunLoop有几种事件源?有几种模式?
答:Timer Source和Input Source(包括performSelector*方法簇、Port或者自定义Input Source);
1)NSDefaultRunLoopMode: 默认的运行模式,除了NSConnection对象的事件。
2) NSRunLoopCommonModes: 是一组常用的模式集合,将一个input source关联到这个模式集合上,等于将input source关联到这个模式集合中的所有模式上。在iOS系统中NSRunLoopCommonMode包含NSDefaultRunLoopMode、NSTaskDeathCheckMode、UITrackingRunLoopMode。
6、方法列表的数据结构是什么?
struct objc_method {
SEL method_name;// 方法名称
char char*method_typesE;// 参数和返回类型的描述字串
IMP method_imp;// 方法的具体的实现的指针
}