RunLoop
RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来使线程随时处理事件并不退出的逻辑。线程执行了这个函数后,就会一直处于这个函数内部 “接受消息->等待->处理” 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回
用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行;而且在没有事件处理的时候,会进入睡眠模式,从而节省CPU资源,提高程序性能。
参考https://blog.ibireme.com/2015/05/18/runloop/#more-41710
参考http://v.youku.com/v_show/id_XODgxODkzODI0.html
Runtime
Objective-C是一门面向对象的动态语言。
runtime:一组为Objective-C实现动态语言特性的API(项目中#import <objc/runtime.h>可查看API)。
其有两个核心:
1、类的各个方面的动态配置;
2、消息传递机制(调用任何方法其实都是进行消息发送,先在当前类的方法列表查找方法,找到即执行方法的IMP,如果没有,则顺着当前类的继承体系查找,直到NSObject,如果还没有,则进行消息转发)
常见用法:
1、获取对象属性列表
2、类别中添加属性、方法
3、方法交换
4、消息发送、消息转发。(包括@property自动生成setter、getter、ivar变量其实都是通过runtime来实现的)
消息转发分为三步:
1、+ (BOOL)resolveInstanceMethod:(SEL)selector;(可以通过动态添加方法)
2、- (id)forwardingTargetForSelector:(SEL)aSelector;(指定其它对象接收此消息)
3、- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector(方法签名)
- (void)forwardInvocation:(NSInvocation *)anInvocation(返回不识别方法的信息)
锁的实现方式
参考
iOS中锁的实现方式有以下几种:
@synchronized、NSLock、dispatch_semaphore、NSCondition、pthread_mutex、OSSpinLock
综合考虑:不考虑性能使用@synchronized,考虑性能使用dispatch_semaphore
实例方法、类方法、私有方法、私有变量
实例方法通常指“+”方法
类方法通常指“-”方法
实例方法与类方法的区别与联系
1.类方法可以调用类方法。
2.类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3.类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
4.类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。
5.self在实例方法中代表的是对象的首地址(object self);在类方法中代表的是class(class self)
OC中没有绝对的私有方法和私有变量
因为OC是一门动态语言,在程序运行过程中,我们是可以通过runtime动态的是获取任何私有变量和私有方法,并且可以修改值或方法。所以并没有严格意义上的私有方法和私有变量。
内存管理
管理机制:通过引用计数来进行管理,遵循“谁创建,谁释放;谁引用,谁管理”的原则。
引用计数实现:通过SideTable实现(__weak同样)。具体可参考:链接
常见修饰符
修饰符:
nonatomic (非原子性)
atomic(原子性)
strong(强引用)
copy(拷贝)
assign (修饰基本数据类型)
unsafe_unretained
weak(修饰不需要增加引用计数的对象)
readwrite(可读写)
readonly(只读)
getter、setter(设置自定义生成的getter和setter方法名)
其中atomic、strong、assign、readwirte为默认修饰符
网友评论