iOS面试宝典1
分类和扩展有什么区别
分类在运行时决议,扩展在编译时决议。分类实现同名的方法会“覆盖”原来的方法;
分类不可以添加属性,扩展可以添加属性;
二者写法不一样;
后编译的分类方法会被插入到类的方法列表前面,因此会先调用分类方法。
UIView和CALayer的区别和联系
区别:
UIView是视图层级结构的基础,也是构建界面可视化的基础元素,它提供了用户交互的能力,例如触摸事件,
也可以执行uiview的界面动画
CALayer是Core Animation 框架中的基础类,用于在屏幕中绘制和管理视觉的内容
用于执行CAAnimation及其子类执行的动画
同时提供了阴影,圆角和文本内容绘制效果
同时每个UIView都关联着一个CALayer对象,负责视图内容的时间绘制和渲染
关联:
UIView需要依赖CALayer来显示内容,通过UIView的属性和方法就可以对CALyer的属性进行设置
总结:
UIVeiw是视图展示和提供交互能里的 CALayer是视图内容绘制和动画的核心
loadView是什么?
loadView() 方法用于手动创建视图控制器的根视图。如果用户没有使用Storyboard和xib情况下自定义的视图
当视图控制器的view属性首次访问时,如果view属性为nil,系统会调用loadView()方法来加载视图,并将其分配给view属性
viewWillLayoutSubViews是什么?
viewWillLayoutSubviews() 方法提供了在视图控制器的根视图即将布局时进行处理的机会。通过重写和使用这个方法,可以确保在需要调整视图布局时,能够及时和有效地对视图进行更新和调整,以保证用户界面的正确显示和响应。
更高性能的加圆角的方式(coenre会有性能问题)
如果能够只用 cornerRadius 解决问题,就不用优化。
如果必须设置 masksToBounds,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。
UIImageView 的圆角通过直接截取图片实现,其它视图的圆角可以通过 Core Graphics 画出圆角矩形实现。
或者让UI提供一张图片
通过UIBezierPath和CAShapeLayer画出一个圆角路径来
页面销毁时,不移除通知会崩溃吗?
iOS9 之后不会了,通知中心对 Observer是弱引用的。
不过通知不手动移除 可能导致当面界面无法被正常释放 其他地方发出通知 这里还能正常的接触通知消息,同时下次进来如果涉及再次添加通知 会导致重复添加通知
多次添加同一个通知和多次移除同一个通知会是什么结果?
多次添加会多次响应。移除没事儿。
设计模式
S 单一功能,或者单一职责。对象各司其职,具有单一功能。
O 开闭原则,软件应该是对于扩展开发的,但是修改关闭的。没问题的代码就最好不要修改。
L 里氏替换,凡是之前用Person 类可以实现的功能,那么换成 Person 的子类也应该可以支持。
I 接口隔离,客户端不应该依赖那些它用不到的接口,应该仅仅依赖它实际使用的方法。如果一个接口具备了多个方法,那么实现类就会实现所有的方法,代码会臃肿。
D 依赖倒置,高层不依赖底层,应该依赖抽象。抽象不依赖细节,细节依赖抽象。对应的设计模式有工厂模式、模板方法、策略。
如果要存储用户的账号密码,你会选择什么方案?
我会选择官方的 KeyChain 服务,因为用户的账号密码属于敏感数据,删除 App 后 KeyChain 中的数据依然保留,并且可以通过 iCloud 同步。这样,当用户下一次安装时,仍然可以读取到相关数据。
常见的持久化方案有哪些?
原生 Sqlite:最原始的数据库
特点:C 语言 API,使用繁琐
适用数据:什么数据都行,只要你不怕麻烦,也不考虑维护成本
CoreData:Apple 对 Sqlite 的封装数据库
特点:用 Sqlite 进行存储,学习成本高,性能差,
使用数据:不建议使用
SwiftData:Apple 新方案、CoreData 继承者
特点: 兼容 CoreData,适合在 SwiftUI 中使用。
FMDB:使用最广的数据库
特点:用 OC 语法对 Sqlite 进行封装,更加面向对象。它是线程安全的。
适用数据:数据量比较大的数据
Realm:自建搜索引擎(而不是封装 sqlite)
特点:MVCC 数据库,更直观易用,更轻量级
使用数据:不太稳定,谨慎使用
WCDB:微信封装的 sqlite
特点:优化了 sqlite 源码,性能更好,上手成本低,功能齐全。而且,微信自己也在用这个数据库,在数亿用户量下遇到的性能、数据损坏问题更多,做的优化更多。强推。而且用了 WCDB 后迁移到 FMDB 成本也比较低。
UI和UX
UI也叫User Interface
UI主要针对的是用户界面设计,主要关注的是应用程序和产品的外观设计和视觉体验
UX也叫User Experience
UX主要针对的是用户体验设计,总要关注的是用户在使用应用程序和数字产品中的整体体验
unsafe_retain和weak有什么区别
unsafe_retain并不是一个直接的Swift概念,而是一个组合了unsafe和retain语义的术语。我们通常会讨论的是Unmanaged类型,它允许我们手动管理对象的引用计数,而不使用自动引用计数(ARC)。unsafe的使用意味着需要开发者自己确保内存安全,这样做可能会导致内存泄漏或野指针错误。
性能优化:在极少数情况下,手动管理引用计数可以减少ARC的开销。
weak是一种自动引用计数(ARC)机制,用于避免强引用循环(retain cycle)。weak引用不会增加对象的引用计数,当引用的对象被释放时,weak引用会自动置为nil。
避免循环引用:在闭包或对象间有相互引用时,使用weak可以避免循环引用导致的内存泄漏。
还是优先使用weak来处理引用关系,确定内存安全和语法简洁
一个 OC 对象指向的内存至少占用多大内存?
系统分配 16 个字节,实际占用 8 个字节,因为一个 oc 对象只有一个 isa 指针占用 8 个字节
由于系统是以16字节为单位来分配内存的,小于16字节就分配16字节,大于16字节会分配16字节的整数倍大小,所以NSObject最后会占用16个字节的内存大小。
load和initialize的区别
