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,判断链表示否有环,为什么走两步?
网友评论