一、判断下列叙述对错 如果是错误请说明原因
1. NSArrey 比 NSSET 查找效率要高。
答:是错误的;
解:NSArray和NSSet都是用于存储对象的集合;NSSet、NSMutableSet声明的对象,是无序的集合,在内存中存储方式是不连续的;而NSArray、NSMutableArray声明的对象,是有序集合,在内存中的存储位置也是连续的。
NSSet和NSArray的区别,在搜索一个单元素时NSSet比NSArray的效率高,主要是因为NSSet用到了哈希算法(hash) NSSet中元素的存储和访问都是一个hash的过程;同时NSSet中是数据无重复集合,同一个元素你存储多少遍都是会存在一个,多余的被覆盖,而NSArray中数据是可以重复的。
例如:
NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", @"6",@"7",@"8", nil];
NSLog(@"set:%@", set);
打印结果:set:{(7, 3,8,4,5,1,6, 2)}
NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6",@"7",@"8", nil];NSLog(@"array:%@", array);
打印结果:
array:(1,2,3,4,5,6,7,8)
2. CGContextRef 是不允许在非主线程绘制的。
答:是对的;为什么必须在主线程中操作UI ,因为UIKit不是线程安全的。
如下面这几种情况:
1.在两个子线程同时设置同一个背景图片,那么很有可能因为当前图片被释放了两次而导致应用崩溃。
2.两个子线程同时设置同一个UIView的背景颜色,那么很有可能渲染显示的是颜色A,而此时在UIView逻辑树上的背景颜色属性为B。
3.两个子线程同时操作view的树形结构:在线程A中for循环遍历并操作当前View的所有subView,然后此时线程B中将某个subView直接删除,这就导致了错乱还可能导致应用崩溃。iOS4之后苹果将大部分绘图的方法和诸如 UIColor 和 UIFont 这样的类改写为了线程安全可用,但是仍然强烈建议讲UI操作保证在主线程中执行。
二、简答题
1. runtime 的用途有哪些,请举例说明
<1> 动态方法交换
Method run = class_getClassMethod([ViewController class], @selector(run));
Method go = class_getClassMethod([ViewController class], @selector(go));
method_exchangeImplementations(run, go);
<2>实现字典和模型的自动转换
(核心就是可以遍历出字典中的每个属性,json解析中大牛框架都用了这个特性,包括MJEXtension,YYModel,jsonModel都是将json转换为字典,再遍历字典中的每个属性来进行modle的转换)
<3> 实现控制器跳转
有一个变态需求,当收到推送过来的消息,需要跳转到对应控制器.利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就可以了。
<4> 热更新 JSPath
主要用于动态的修复bug或页面,而不需要通过苹果审核。
<5> 增删改查换一个类的方法、成员变量、以及属性。
2.写出UIButton的继承关系,一直到NSObject
UIButton -->UIControl-->UIView-->UIResponder-->NSObject
3.写出一个单利
1 24.请写出以下代码执行后的结果
关于GCD的认识:GCD(Grand Central Dispatch)的使用 多线程之GCD——基本概念与队列(Dispatch Queue)
网友评论