<<写给广大非科班iOS开发者的一篇面试总结>>答案

答案来源于网上,非原创,如有侵权请联系本人

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;

}

见下图:

<<写给广大非科班iOS开发者的一篇面试总结>>答案_第1张图片

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;// 方法的具体的实现的指针

}

你可能感兴趣的:(<<写给广大非科班iOS开发者的一篇面试总结>>答案)