iOS知识点回顾 - LostHu/Docs GitHub Wiki

iOS知识点回顾

  1. @property 后面可以有哪些修饰符?
  • atomic(默认) 原子性,线程安全,防止在写未完成的时候被其他线程读取,自动生成自旋锁代码,当上一个线程未执行完下一个线程会一直等待。会消耗大量资源,效率低。
  • nonatomic 非原子性,非线程安全,放弃安全,提高性能
  • assign 可修饰基本数据类型OC对象,不会增加引用计数,如果是指针被释放后,仍指向对应内存,必须手动置nil,否则会产生野指针。
  • weak 弱引用,只能修饰OC对象,如果指向的对象被释放了,会自动置为nil,比较安全。
  • strongretain都修饰OC对象,强引用,setter方法会先将旧对象release掉,再将新值赋给该对象并进行一次retain操作,都会增加引用计数。strong一般用于ARCretain用于MRC
  • strongcopy
  • copy 一般修饰不可变对象,如果修饰可变对象,则调用可变方法会报错;在setter方法中做如下判断(如果较多copy,需要考量性能): 如果赋值来源是不可变对象时和strong一样进行浅拷贝,引用计数+1。 如果赋值来源是可变对象则进行深拷贝,不会增加引用计数。
  • strong 修饰不可变对象 如果赋值来源是不可变对象没问题 如果赋值来源是可变对象会造成破坏封装性
  • strong 修饰可变对象 如果赋值来源是不可变对象会报错 如果赋值来源是可变对象没问题
  • settergetter 替换成自定义函数
  • __unsafe_unretained 与__weak一样,对象即使被销毁指针也不会置空,一般用于与C语言交互
  1. @property 的本质是什么? @property 的作用?
  • @property = ivar + setter + getter (实例变量+存取方法) 完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”,这个过程由编译器在编译期执行。
  • @property的作用是是编译器会自动添加gettersetter方法
  1. 代理一般如何修饰?Block如何修饰?

代理一般使用weak修饰,如果使用strong会造成循环引用 Block一般使用copy修饰,只有copy后的block才会在堆中。

  1. @protocol和category中如何使用@property
  • 都只会生成getter和setter方法声明。
  • 如果要给category增加属性需要使用运行时函数:
  1. objc_setAssociatedObject
  2. objc_getAssociatedObject
  1. 如何让自己的类用copy修饰符?如何重写带copy的关键字的setter?

需要实现NSCopying协议,如果需要区分可变和不可变版本,则还需要实现NSMutableCopying协议

  1. @synthesize@dynamic 分别有什么作用?
  • 如果2个都没写,则默认@synthesize var = _var;
  • @synthesize如果没有手动实现setter和getter方法,则编译器自动为你加上这2个方法。
  • @dynamic告诉编译器getter和setter方法由用户自己生成,如果没提供这2个方法,编译通过,但运行时使用到这2个方法则会崩溃。
  1. ARC下,不显式指定任何属性关键字,默认关键字?
  • 基本数据类型:atomic readwrite assign
  • OC对象: atomic readwrite strong
  1. autorelease对象什么时候释放?
  • 手动干预,指定autoreleasepool的大括号结束时释放
  • 自动释放,对象出了作用域之后,会被添加到最近一次创建的自动释放池。系统检测到事件并且启动后,即会创建自动释放池
  1. KVO实现原理?
  • 当你观察一个对象时候,一个新类动态创建,新类继承自被观察对象的类,并重写了setter方法,并将此对象的isa指针指向新类(isa-swizzling),此对象就变成了新类的实例。
- (void)setA:(NSString*)a
{
  [self willChangeValueForKey:@"a"];
  [super setValue:a forKey:@"a"];
  [self didChangeValueForKey:@"a"];
}
  1. 如何高效实现对UIImageView加圆角?

工作线程利用CoroGraphic API 生成一个offscreen UIImage,切换到主线程赋值给ImageView。需要考虑绘制缓存问题。

  1. drawRect?

利用CPU生成offscreen bitmap,问题是复杂+内存开销大,减轻GPU绘制压力,一般需要平衡CPU和GPU压力。

  1. 常用的设计模式?
  • 单例模式
  • 观察者模式
  • 响应者模式
  • 组合模式
  • 代理模式
  1. APNs流程?

Apple Push Notification Server:设备和APNs服务器之间的通讯是基于SSL协议的TCP长连接。

  1. 开发者注册配置APNs消息推送 (申请证书配置,2种,开发和发布环境)
  2. APP启动时注册APNs服务器,参数为设备序列号
  3. APNs经过处理后将产生的device_token返回给设备
  4. APP使用device_token向自己的应用服务器注册
  5. 应用服务器将推送内容+device_token打包后发给APNs
  6. APNs推送至设备
  1. APP生命周期?
  • Not running
  • Inactive:运行在前台+没有接收事件。状态切换,会短暂停留。长期停留(锁屏、来电、短信等)
  • Active:运行在前台+接收事件
  • Background:运行在后台+执行代码
  • Suspended:运行在后台+不执行代码
  1. 链式语法实现原理?

调用函数方法 [object a]; 如果需要**[[object a] b];继续调用下一个b方法,则需要a方法返回object对象本身**。 如果需要实现object.a();,则需要使用block,一般调用block的语法是此样式。