1.Flutter和RN有什么区别,你更看好那个?
- flutter是由Engine 层适配和跨平台支持Skia渲染,RN是通过JavaScripeCroe渲染原生,所以flutter的运行效率会更高.尤其是在低端手机上比较明显.
- flutter实现了自己的一套UI框架,RN是渲染的原生UI,所以flutter写出来的界面会更加统一
- flutter使用dart语言,RN使用js语言,对于原生开发人员来说更容易上手
- flutter发展的比较晚,没有RN的第三方库多.但是flutter的生态圈一直在完善中
- flutter调试可以直接在AS中,RN调试需要借助浏览器.flutter断点调试更加的方便
- flutter的集成方式更简单,打出的包会更小
- flutter不支持热更新.RN支持热更新.
- flutter缺点:(1)断点调试,js调用原生,不太好调试 (2)死亡嵌套,嵌套比较深,代码量大,没有原生简洁。(3)排查问题方面,有可能是flutter的问题,有可能是原生的问题,不方便排查。
我个人更看好flutter,集成调试更加简单,界面写起来也更加灵活,生态也在不断完善中.
2.oc可以实现多继承么?如何实现
- 多继承可以允许子类从多个父类派生,而Objective-C并不支持多继承,但我们仍可间接实现。
-
oc不支撑多继承,但是可以通过代理协议、分类、消息转发实现多继承
多继承方法比较
3.iOS如何实现多态?
父类指针指向子类对象。通过继承实现。
4.合并两个有序数组
5.深拷贝与浅拷贝的区别?
- 浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
- 深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。
- 不可变字符串copy为指针复制,mutacopy为内容复制
NSString *str = @"hello word!";
NSString *strCopy = [str copy] // 指针复制,strCopy与str的地址一样
NSMutableString *strMCopy = [str mutableCopy] // 内容复制,strMCopy与str的地址不一样
- 可变字符串的copy和mutableCopy都是内容复制
NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
NSString *strCopy = [mutableStr copy] // 内容复制
NSMutableString *strMCopy = [mutableStr mutableCopy] // 内容复制
- 不可变数组copy为指针复制,mutableCopy为内容复制。
但是注意的是集合对象的内容复制仅限于对象本身,对集合内的对象元素仍然是指针复制。(即单层内容复制)
NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArr = [arr copy]; // 指针复制
NSMutableArray *mCopyArr = [arr mutableCopy]; //单层内容复制
- 可变数组与不可变数组都是单层内容复制
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArr = [mutableArr copy]; // 单层内容复制
NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 单层内容复制
6.NSArray为什么不能用strong修饰?
-
用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。
-
如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
-
因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
-
如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。
7.修饰的关键字?
- readwrite 是可读可写特性。需要生成getter方法和setter方法。
- readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。
- assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型。
- retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。
- copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。
- nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程安全,一般使用nonatomic,效率高。
- weak 表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空.修饰代理及xib链接出来的组件
8.atomic原子性是绝对线程安全的么?
- 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。
- 而nonatomic就没有这个保证了。所以,nonatomic的速度要比atomic快。
- 不过atomic可并不能保证线程安全。如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。
9.网页的缓存策略?
10.WKWebview与UIWebview的对比?
- 占用内存大幅提示,UIWebview占用内存是很夸张的
- 网页加载速度有提升,提升不是很明显
- 支持HTML5的特性
- 增加了加载进度属性:estimatedProgress
11这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;
问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。
-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
- copy后返回的是不可变对象(即 arr 是 NSArray 类型,NSArray 类型对象不能调用 NSMutableArray 类型对象的方法)
- 原因:是因为 copy 就是复制一个不可变 NSArray 的对象,不能对 NSArray 对象进行添加/修改。
12.写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name
// retain
- (void)setName:(NSString *)str {
[str retain];
[_name release];
_name = str;
}
// copy
- (void)setName:(NSString *)str {
id t = [str copy];
[_name release];
_name = t;
}
13.如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。
具体步骤:
1. 需声明该类遵从 NSCopying 协议
2. 实现 NSCopying 协议的方法。
// 该协议只有一个方法:
- (id)copyWithZone:(NSZone *)zone;
// 注意:使用 copy 修饰符,调用的是copy方法,其实真正需要实现的是 “copyWithZone” 方法。
网友评论