在后台,正常情况下程序只被允许执行非常有限的一点点时间(通常是180秒),然后就会随时被挂起,当设置了UIBackgroundTaskIdentifier后台任务标记时,程序后台保活会延迟到三分钟左右, 再设置后台持续定位,或者持续voip播放模式后,会长时间保活,这个时间从原理上可以无限(参考网易、酷狗等音乐播放器),后台持续定位模式所持续的时间基本在2小时左右
LinkedScroll-一款类似主流新闻客户端(板块标题-内容)上下联动的框架
LinkedScroll是一款处理上下联动的使用框架, 因为在开发过程中经常碰到类似的业务需求所以才写了这个库,它不仅适配iPhoneX系列手机, 并且支持屏幕旋转. 使用方法和UITableView的使用方法基本一致. 后期会不断增加新的功能.欢迎各位使用者提出建议和意见.
React Cocoa简单使用手册
在绘制UI时,我们常希望能够直接获取所需数据,但大多数情况下,数据需要经过多个步骤处理后才可使用,好比UI使用到的数据是经过流水线加工后最后一端产出的成品。众所周知,流水线是由多个片段管线组成,上端管线处理后的已加工品成为下端管线的待加工品,每段管线都有对应的管线工人来完成加工工作,直至成品完成。
3DTouch
3D Touch是一种立体触控技术,被苹果称为新一代多点触控技术,是在Apple Watch上采用的Force Touch,屏幕可感应不同的感压力度触控。3D Touch,苹果iPhone 6s的新功能。有Peek
和Pop
两种新手势。3D-Touch技术,相对于多点触摸在平面二维空间的操作,3D-Touch技术增加了对力度和手指面积的感知,可以通过长按快速预览/查看你想要的短信/图片/超链接等内容,Peek和Pop手势的响应时间可迅捷到10ms和15ms
KVO的实现原理
KVO
全称KeyValueObserving
,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO
的实现机制,所以对属性才会发生作用,一般继承自NSObject
的对象都默认支持KVO
。
KVO
和NSNotificationCenter
都是iOS
中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO
是一对一的,而不一对多的。KVO
对被监听对象无侵入性,不需要修改其内部代码即可实现监听。
实现原理
KVO
是通过isa-swizzling
技术实现的(这句话是整个KVO
实现的重点)。在运行时根据原类创建一个中间类(NSKVONotifying_xxx
),这个中间类是原类的子类,并动态修改当前对象的isa
指向中间类。并且将class
方法重写,返回原类的Class
。所以苹果建议在开发中不应该依赖isa
指针,而是通过class
实例方法来获取对象类型。
KVO
会重写keyPath
对应属性的setter
方法,没有被KVO
的属性则不会重写其setter
方法。在重写的setter
方法中,修改值之前会调用willChangeValueForKey:
方法,修改值之后会调用didChangeValueForKey:
方法,这两个方法最终都会被调用到observeValueForKeyPath:ofObject:change:context:
方法中。
实现过程
- 某个类(Cat)的属性在第一次被观察时,runtime会动态的创建一个Cat类的子类,名为
NSKVONotifying_Cat
,然后重写所有Cat类中被观察属性的Set方法,然后通过NSKVONotifying_Cat
类中重写的Set方法实现属性改变的通知. - 每个类对象都会有一个isa指针指向当前类,当我们第一次观察这个类时,原类Cat的isa指针就会指向其派生类
NSKVONotifying_Cat
,那么此时我们调用原类对象的set方法其实就是调用的派生类NSKVONotifying_Cat
的set方法. - 键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey:和 didChangeValueForKey:在一个被观察属性发生改变之前 willChangeValueForKey:一定会被调用这就 会记录旧的值。而当改变发生后didChangeValueForKey:会被调用继而 observeValueForKey:ofObject:change:context:也会被调用。
- KVO的这套实现机制中苹果还偷偷重写了class方法让我们误认为还是使用的当前类从而达到隐藏生成的派生类
综上所述,其
可变容器的监听
例如对Cat类的某个可变容器属性监听之后如果直接调用[self.cat.foods addObject:@"1"];
那么时不会出发KVO的, 因为KVO的本质是调用了派生类的set方法,而addObject没有调用Set方法,正确的使用方式应该是这样的:
[[self.cat mutableArrayValueForKey:@"foods"] addObject:@"1"];
注意点
在调用addObserver
方法后,KVO
并不会对观察者进行强引用,所以需要注意观察者的生命周期,否则会导致观察者被释放带来的Crash
KVO
的addObserver
和removeObserver
需要是成对的,如果重复remove
则会导致NSRangeException
类型的Crash
,如果忘记remove
则会在观察者释放后再次接收到KVO
回调时Crash
。
苹果官方推荐的方式是,在init
的时候进行addObserver
,在dealloc
时removeObserver
,这样可以保证add
和remove
是成对出现的,是一种比较理想的使用方式。
###
jenkins自动打包
安装, 下文安装步骤写的十分详细,请看完之后再继续阅读下面的文章, 下面是我自己在集成过程中遇到的一些问题和注意事项,供大家参考.
Objective-C Runtime 运行时之六:拾遗
前面几篇基本介绍了runtime中的大部分功能,包括对类与对象、成员变量与属性、方法与消息、分类与协议的处理。runtime大部分的功能都是围绕这几点来实现的。
Objective-C Runtime 运行时之五:协议与分类
Objective-C中的分类允许我们通过给一个类添加方法来扩充它(但是通过category
不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到。
Objective-C Runtime 运行时之四:Method Swizzling
理解Method Swizzling
是学习runtime
机制的一个很好的机会。在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文。
Objective-C Runtime 运行时之三:方法与消息
前面我们讨论了Runtime
中对类和对象的处理,及对成员变量与属性的处理。这一章,我们就要开始讨论Runtime
中最有意思的一部分:消息处理机制。我们将详细讨论消息的发送及消息的转发。不过在讨论消息之前,我们先来了解一下与方法相关的一些内容。