美文网首页
iOS开发 基础二

iOS开发 基础二

作者: 喜剧收尾_XWX | 来源:发表于2020-12-29 19:59 被阅读0次

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不支撑多继承,但是可以通过代理协议、分类、消息转发实现多继承


    多继承方法比较

参考链接 https://www.jianshu.com/p/9601e84177a3

3.iOS如何实现多态?

父类指针指向子类对象。通过继承实现。

4.合并两个有序数组

https://www.jb51.cc/iOS/525946.html

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的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

https://www.jianshu.com/p/a4892d1931f3

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

https://www.jianshu.com/p/72ca72098d81

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” 方法。

14.保护线程安全的几种方式

https://www.jianshu.com/p/e21baa43217e

相关文章

网友评论

      本文标题:iOS开发 基础二

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