- 属性修饰符使用场景
- 什么是循环引用?如何避免循环引用?
- autoreleasepool的原理
- tips:自动释放池的实质是在开始处调用了autoreleasePoolPush方法,而在结束时调用了autoreleasePoolPop方法。其实push方法的作用是向这个双向链表结构的当前autoreleasePoolPage中插入哨兵对象,pop方法的作用是将插入的哨兵对象后的所有自动释放对象进行release操作。
- iOS内存分布(代码区/常量区/全局静态区(又分为BSS和Data)/堆区/栈区)
- tips:栈区由系统进行分配,通常用来存放函数参数、局部变量等数据。在实际开发中,指针变量本身存放在栈中,指向的对象数据会存放在堆中
- block本质及分类
- block中使用全局变量/局部变量时的注意事项
- block中的循环引用
- 同一时间,CPU只能处理一条线程,只有一条线程在执行。
- 多线程同时执行,其实就是CPU执行快速地在多条线程之间调度(切换)
- GCD:C语言
- NSOperation:基于GCD(底层是GCD) 比GCD多了一些更简单实用的功能 使用更加面向对象
- 一一对应的关系
- runloop是用来管理线程的。当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务
- runloop在第一次获取时被创建,在线程结束时被销毁
- 对于主线程来说,runloop在程序一启动就默认创建好了。对于子线程来说,runloop是懒加载的——只有当我们使用的时候才会创建。
- Plist(NSArray\NSDictionary),只存储数组、字典,但是数组和字典里不能有自定义对象。
- 偏好设置(Preference\NSUserDefaults),也不能存储自定义对象。
- 归解档,存储自定义对象。 局限:一次性读取和存储操作。
- SQLite3: 操作数据比较快/可以局部读取/比较小型,占用的内存资源比较少
- FMDB
- 解释 UIViewController 的生命周期。
- 介绍常见的 UIViewController 之间的跳转方式。
- 什么是 UIViewController 的容器视图控制器(Container View Controller)?举例说明。
- UITableView 和 UICollectionView 有什么区别?
- 解释 UITableView 的重用机制(Cell Reuse)。
- 自定义 UITableViewCell 和 UICollectionViewCell 的步骤和常见问题。
- 什么是 Autolayout?在什么情况下使用 Autolayout?
- 使用 Autolayout 实现自定义视图的步骤。
- 如何实现平滑的动画效果?列举几种动画实现方式。
- 什么是 CoreData?它与 SQLite 和 UserDefaults 的区别是什么?
- CoreData 的核心组件是什么?
- 如何在 iOS 中使用 CoreData 进行数据持久化?
- NSUserDefaults 和 Keychain 分别用于什么场景?
- 如何安全地存储敏感信息,例如用户密码?
- 在 iOS 中如何进行网络通信?列举常见的网络通信库和框架。
- 解释 RESTful API 的概念和使用方式。
- 什么是 JSON?如何在 iOS 中解析和生成 JSON 数据?
- 介绍 Codable 协议和它的作用。
- 如何优化 iOS 应用的性能?
- 使用什么工具来检测和解决内存泄漏问题?
- 如何进行性能调试和 Instruments 分析?
- 什么是 APNs?如何实现远程推送通知?
- 如何进行版本适配和设备适配?
- 解释 iOS App 的生命周期。
- S测试跳转链接