iOS开发 常见知识(二)
1.以下是常见的@property修饰词及其含义:
nonatomic:非原子性,表示不使用加锁机制来保证多线程读写安全。使用非原子属性可以获得更好的性能,但在多线程环境下可能会导致数据竞争问题。
strong:表示强引用关系,用于持有对象的引用。当多个对象持有同一个对象时,它的引用计数会增加1,只有当没有任何强引用指向该对象时,才会被释放。
weak:表示弱引用关系,用于避免引起循环引用。当一个对象只被弱引用指向时,引用计数不会增加,当没有任何强引用指向该对象时,会被释放。
assign:用于简单类型的赋值,如NSInteger、BOOL等。不会增加引用计数,也不会进行内存管理。
copy:表示拷贝关系,用于复制属性的值。在设置值时会创建一个新的副本,适用于可变对象,确保属性值的独立性,避免因为共享而导致的数据修改问题。
readonly:只读属性,只生成getter方法,不会生成setter方法。只读属性只能通过初始化时赋值,之后无法修改。
readwrite:可读写属性(默认),既生成getter方法,也生成setter方法。
static,const与extern
static修饰的变量存储在静态区,在编译时就分配好了内存,会一直存在app内存中直到停止运行,在创建单例类的时候会使用到static
const常用于声明常量,只读不可写,该常量存储在常量区,编译时就分配了相关内存,也会一直存在app内存直到停止运行
extern用于声明外部全局变量/常量,告诉编译器需要找对应的全局变量,需要在.m中实现,如下写法是错误的
2.iOS开发常用的三方库
Alamofire:网络请求库 SnapKit:自动布局库 SwiftyJSON: JSON数据解析库 SDWebImage: 异步加载图片库 Masonry: 自动布局库
3.请解释iOS中的Storyboard是什么,以及它的作用和优势
Storyboard是iOS开发中一种可视化的界面设计工具,它可以帮助开发者通过拖拽和连接视图控制器来快速构建应用的界面,并管理界面之间的转场关系。使用Storyboard可以减少手动编写界面布局和跳转逻辑的工作量,从而提高开发效率。
4.请解释iOS中的AppDelegate是什么,以及它的作用和生命周期?
AppDelegate是iOS应用程序的代理对象,它是一个遵循UIApplicationDelegate协议的类,它负责管理应用程序的生命周期,包括启动、进入前台、进入后台、终止等状态的转换,同时处理系统级别的事件,如接收远程通知、本地通知、处理URLScheme等。
5.多线程篇
GCD(Grand Central Dispatch)是iOS开发中用于管理并发任务的技术。它通过队列(Dispatch Queue)和块(Block)的概念,简化了多线程编程的复杂性。通过GCD,可以轻松地实现异步执行任务、任务的串行或并发执行,以及任务间的依赖关系控制。
NSOperation 是 iOS 开发中用于管理任务的一个关键类。它是基于 GCD 的高级抽象,允许我们将任务封装成一个对象并添加到操作队列中执行。NSOperationQueue 允许我们将操作添加到队列中,队列会自动管理操作的执行,包括并发和串行执行、任务依赖关系、优先级等。与 GCD 相比,NSOperation 提供了更高级和面向对象的方式来管理并发任务。
NSThread
使用 NSThread,我们可以创建新的线程并将任务放在其中执行。通过调用 start 方法,我们可以启动一个线程,并在 main 方法中定义需要执行的任务。NSThread 还提供了一些其他方法,如设置线程的优先级、暂停和终止线程等。
相对于 GCD 和 NSOperation,NSThread 较为底层,需要开发者手动管理线程的生命周期和执行过程。
队列与同步异步
1.队列与并发
队列是一种先进先出线性的数据结构,是计算机系统为了对任务进行调度的一种抽象化机制--在线程与任务之间搭建起桥梁,即将任务调度分配到具体的线程上。
至于队列是串行还是并发,区别在于队列执行任务的方式——是否等待当前任务结束。
串行队列:是否等待当前任务结束:是 表现方式 任务一个接着一个执行
并发队列:是否等待当前任务结束:否 可以并发执行任务
2.同步与异步
同步的表现是:阻塞线程,执行完成才继续之后的后续代码
异步的表现是:不会阻塞线程,调用后立即返回