iOS面试深度解析:2018年最新考题

需积分: 15 12 下载量 44 浏览量 更新于2024-09-14 收藏 5KB TXT 举报
"这是一份2018年的iOS面试题集合,涵盖了Objective-C语言特性、设计模式、内存管理、多线程、UI组件、数据持久化、运行时等多个方面的内容,旨在帮助iOS开发者准备面试,提升技能。" 以下是根据摘要内容详细解释的知识点: 1. Objective-C动态性: Objective-C是一门动态类型语言,它的动态性体现在运行时绑定(runtime binding)、动态加载类和方法、以及消息传递等方面。 2. MVC, MVVM, MVP: MVC(Model-View-Controller)是经典的软件设计模式,用于分离业务逻辑、数据和用户界面。MVVM(Model-View-ViewModel)在MVC基础上引入了ViewModel,更利于数据绑定。MVP(Model-View-Presenter)中Presenter作为View和Model之间的桥梁。 3. 代理使用weak的原因: 代理通常使用`weak`防止循环引用,因为代理对象通常是一个拥有者对象,如果使用`strong`可能导致持有循环,使得两个对象都无法释放。 4. 属性的实质: 属性是Objective-C中的一个语法特性,包括setter和getter方法、ivar(实例变量)以及内存管理策略。默认的关键字包括`nonatomic`、`readwrite`、`assign`。 5. @dynamic和@synthesize: `@dynamic`声明属性由运行时处理,通常用于协议中。`@synthesize`自动为属性生成setter和getter。 6. NSString与copy关键字: `copy`用于创建字符串的副本,确保内存管理独立,避免原始字符串被修改。若使用`strong`,则可能指向同一块内存,修改一处会影响到另一处。 7. 实现拷贝功能: 若要让自定义对象支持拷贝,需要实现`NSCopying`或`NSCopying`和`NSMutableCopying`协议,并重写`copyWithZone:`或`mutableCopyWithZone:`方法。 8. 集合类的copy和mutablecopy: `copy`返回不可变集合的浅拷贝,内部元素的引用不变。`mutableCopy`返回可变集合的深拷贝,允许修改拷贝后的集合及其元素。 9. IBOutlet与weak: `IBOutlet`连接的视图通常用`weak`,因为它们被 nib 或 storyboard 拥有,避免循环引用。 10. nonatomic与atomic: `nonatomic`是非原子性,效率高但不保证线程安全;`atomic`是原子性,保证基本的线程安全,但并非绝对线程安全。线程安全的实现通常需要额外的同步机制。 11. UICollectionView自定义布局: 自定义UICollectionViewLayout需要重写多个方法,如`layoutAttributesForItem(at:)`和`layoutAttributesForElements(in:)`,来指定cell的位置和大小。 12. Storyboard的弊端及避免方式: 故障排查困难、代码难以自动化测试。避免方式包括部分视图用代码创建、分离业务逻辑到单独的类。 13. 进程与线程: 进程是系统资源分配的基本单位,线程是CPU调度的基本单位。同步异步涉及是否等待任务完成,并发是在一个时间段内多任务执行,而并行是在同一时刻执行多任务。 14. 线程间通信: iOS中线程间通信方式包括`NSOperationQueue`、`GCD`的`dispatch_queue`、`NSNotification`等。 15. GCD常用函数: 包括`dispatch_queue_create`创建队列,`dispatch_async`异步执行,`dispatch_group`组操作,`dispatch_barrier`屏障,信号量`dispatch_semaphore`,以及线程同步等。 16. 避免资源抢夺: 使用串行队列或GCD的同步机制(如`dispatch_barrier`)可避免资源抢夺。 17. 数据持久化: 数据持久化方法有SQLite(如FMDB)、Core Data、Plist、JSON、Property List等。 18. AppDelegate方法: AppDelegate包含很多生命周期方法,例如`application:didFinishLaunchingWithOptions:`(首次启动),`applicationWillEnterForeground:`(从后台回到前台)等。 19. NSCache与NSDictionary: NSCache是缓存类,比NSDictionary更适合缓存,因为它会在内存不足时自动清除数据。 20. DesignatedInitializer: 设计初始化器是类的主要初始化方法,子类需要调用父类的designated initializer来保证正确初始化。 21. description方法: 实现`description`方法可以自定义对象转为字符串的内容,便于调试和日志记录。 22. 内存管理: Objective-C使用引用计数(ARC)管理对象内存,当对象引用计数为0时,对象会被释放。 23. Block本质: Block是闭包,可以捕获和存储上下文中的变量。存在栈Block、堆Block两种,栈Block通常在函数内部生成,堆Block可能作为对象成员。 24. Block捕获变量: 默认情况下,Block捕获的局部变量是复制的,不能直接修改。`__block`关键字使变量在Block内部可变。 25. 消息发送机制: 当Objective-C向对象发送消息时,会通过运行时查找对应的方法实现并执行。 26. unrecognizedselector错误: 发送对象未实现的方法时会出现此错误。避免方式是检查方法名拼写、确保对象遵循协议、使用`respondsToSelector:`检查。 以上是iOS面试中常见的技术点,涵盖了许多iOS开发的核心概念和最佳实践。理解并掌握这些知识点对于iOS开发者来说至关重要。