某条

作者: 哈哈哈我的简书账号 | 来源:发表于2017-03-17 11:38 被阅读12次

    1,一个类的delegete一般设置一个,怎么设置多个delegate呢?

    runtime

    2,分类可否实现load方法?

    答案肯定可以,因为runtime的方法交换就是在这个方法里做的。

    3,load,initialize方法需要调super么?

    4,load方法什么时候调,与initialize有什么区别?什么时候用load,什么时候用initialize?

    load方法在系统加载时调用,initialize在第一次使用的时候调用,
    load方法在调用的时候,好多类有可能还没加载,因此建议只在这里实现方法交换,initialize

    在调用的时候,环境已经建立完全,在这里主要做一些静态变量的初始化,全局变量的初始化操作。

    load方法调用的时候,runtime直接调用函数指针,但是initialize是通过objc_masgSend()

    5,自动释放池何时释放对象?

    
    - (NSAarray *)customMethod{
    
                NSAarray * obj;
    
                @autorelease{
    
                           obj = [NSArray array];(其实在ARC下并不是自动释放的)
    
                  }
    
                  return obj;
    
    } 
    
    

    问会返回什么值?

    首先在ARC下这不是自动释放的,obj强持有,会返回对象。在MRC下,对象被自动释放,返回野指针

    5,delegate,notification,block,kvo区别?

    delegate

    优点:1).非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。

           2).如果delegate中的一个方法没有实现那么就会出现编译警告/错误
    
           3).协议必须在controller的作用域范围内定义
    
           4).在一个应用中的控制流程是可跟踪的并且是可识别的;
    
            5).在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates
    
            6).没有第三方对象要求保持/监视通信过程。
    
             7).能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller
    

    需要声明协议,代理对象必须严格遵守协议,代码结构清晰,便于调试,一个类可以实现多个协议,也可以设置多个delegete

    缺点:1),需要声明相应属性,

            2),如果delegte对象释放,容易崩溃
    

    notifacation

    优点:1).不需要编写多少代码,实现比较简单;

          2).对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单
    
          3).controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
    

    缺点:

    1).在编译期不会检查通知是否能够被观察者正确的处理;

    2).在释放注册的对象时,需要在通知中心取消注册;

    3).在调试的时候应用的工作以及控制过程难跟踪;

    4).需要第三方对喜爱那个来管理controller与观察者对象之间的联系;

    5).controller和观察者需要提前知道通知名称、UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;

    6).通知发出后,controller不能从观察者获得任何的反馈信息。

    block:

    优点:

    缺点:

    kvo

    优点:

    1).能够提供一种简单的方法实现两个对象间的同步。例如:model和view之间同步;

    2).能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;

    3).能够提供观察的属性的最新值以及先前值;

    4).用key paths来观察属性,因此也可以观察嵌套对象;

    5).完成了对观察对象的抽象,因为不需要额外的代码来允许观察值能够被观察

    缺点:

    1).我们观察的属性必须使用strings来定义。因此在编译器不会出现警告以及检查;

    2).对属性重构将导致我们的观察代码不再可用;

    3).复杂的“IF”语句要求对象正在观察多个值。这是因为所有的观察代码通过一个方法来指向;

    4).当释放观察者时不需要移除观察者。

    6,用分类声明属性,创建关联对象,关联对象如何管理?

    放在ObjectAssociationMap里。

    7,weak和assgin的区别,对象可以使用assgin么?使用会怎么样?

    weak和assigin都不会持有对象,但是yong weak修饰对象,对象释放的时候,相应对象指针会付为nil值。weak只能修饰对象,assign可以修饰基本类型

    8,如何用GCD实现下载5张图片,全部下载完在合成为一张?

    9,如何用GCD实现先下载1,2两张图,在下载3,4,5三张图?其中1,2并行,3,4,5并行,(1,2)->(3,4,5)串行

    10,GCD如何实现按序下载5张图片?1,2,3并行下载,1,2,3下载完, 4,5并行下载

    
    dispatch_queue_t queue = dispatch_queue_create("com.apple.fgyong",DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue,^{       
    
    NSLog(@"queue1 begin");sleep(2);NSLog(@"queue1 end");});
    
    dispatch_async(queue,^{       
    
                  NSLog(@"queue2 begin");sleep(2);NSLog(@"queue2 end");});
    
    dispatch_barrier_sync(queue,^{        NSLog(@"main:%@",[NSThread mainThread]);});
    
    dispatch_async(queue,^{        NSLog(@"queue3 begin");sleep(2);NSLog(@"queue3 end");});
    
    

    11,如何实现读写锁?

    12,如何实现控制最大线程并发数?GCD

    13,RunTime方法缓存?父类方法会缓存在什么地方,是父类缓存列表还是子类缓存列表?

    objc_msgSend的追溯中我们可以看到,即便是从父类取到的方法,也会存在类本身的方法缓存里。而当用一个父类对象去调用那个方法的时候,也会在父类的metaclass里缓存一份

    14,未识别的方法方法如何转发?

    15,是否就可以给实例对象增加实例变量?是否可以添加方法?

    16,方法缓存为什么在类对象列表?为啥不是存储在实力对象里?

    17,两次实现load方法,在load方法里实现相同的方法交换,结果是啥?

    18,说说内存管理

    19,什么是block?block的实质是什么?

    20,KVO具体怎么实现?

    修改实例对象的is_a指针,指向新创建的子类,子类对象里重写啦seter方法,

    
    - (void)setAbc: ,,,,,{
    
    [self willChangeValueForKey:@"abc"];
    
    [super setValue: ,,,,  ForKey:@"abc"];
    
    [self didChangeValueForKey:@"abc"];
    
    }
    
    didchangevalueforkey
    
    

    21,如何实现自定义KVO,实例变量可以使用KVO嘛?

    22,子类load与initialize,需要调用父类的相应方法么?

    不需要调用,也不能调用,调super会导致方法多次执行,这两个方法比较特殊。内部没有super,runtime保证运行顺序。执行顺序都是从父类到子类,不同的是分类里的load会在之后调用,然而是分类里的initialize方法会覆盖类的方法。当第一次使用类的时候,initialize初始化子类的时候,系统会递归初始化父类

    
    (if (supercls  &&  !supercls->isInitialized()) {
    
    _class_initialize(supercls);
    
    }),
    
    

    因此,会先调用父类再调用子类。走消息转发

    23,分类里的方法怎么添加到类对象的方法列表的?

    加载的时候会插入到类对象方法列表的前边,如果有重复的方法会覆盖原实例对象的方法。

    对于分类与类重复的方法,调用这个方法,不管有没有导入分类的头文件,调用的都是分类的方法。

    对于不重复的方法,不管有没有导入分类的头文件都可以调用,只不过没有导入的时候,需要使用performSeleter:

    24,判断链表示否有环,为什么走两步?

    相关文章

      网友评论

          本文标题:某条

          本文链接:https://www.haomeiwen.com/subject/hmkenttx.html