正式由iPhone OS改名为IOS
新增了以下特性和API
1.多任务
这个自然不用多说,招牌特性具体细节是这样,点了home键之后,运行的程
序并没有被彻底关掉,而是进入到suspended状态就像虚拟机被暂停- -样,数据和状
态都在,只是被freezed,可以随时恢复,当然也有可能随时被彻底干掉,比如在内存低的
状况下.所以被suspended应用要随时准备着就义.那么这个多任务究竟体现在哪里
呢?
a.在进入休眠状态之前可以申请很短的时间,保存一些数据或者干点什么坏事.
b.可以向系统申请一段时间小范围的复活一下,执行一些动作
c.可以向系统注册local notification,说白了就是订个闹钟,在某特定时间或者特定
事件跳出一个类似push notification的东西提醒用户.
- local notification
简单说就是你的app可以在系统中设定一个特定时间或者事件
的提醒,就算你的app完全没有被启动也可以.push notification的local版本
uiapplication新增了local notification的相关api
3.eventkit
简单的说就是你的应用现在有办法向用户的calander添加一个事件
-
core motion动作侦测
可以提供原始数据,你可以自己做数据处理,也可以提供系
统处理后的数据,比如角速度什么的.在拥有陀螺仪的设备上还可以提供陀螺仪的数据
在iOS4之前,加速度计由UIAccelerometer类来负责采集工作,而电子罗盘则由
Core Location接管。而iPhone4的推 出,由于加速度计的升级(有消息说使用的是
这款芯片)和陀螺仪的引入, 与motion相关的编程成为重头戏,所以,苹果在iOS4
中增加一个一个专门负责该方面处理的框架,就是Core Motion Framework。
它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的
三维attitude信息.
image.png
Core Motion在iOS4.0主要负责三种数据:加速度值,陀螺仪值,设备motion值。实际上,这个设备motion值就是通过加速度和旋转速度进行fusing变换算出来的,基本原理后面会介绍。Core Motion在系统中以单独的后台线程的方式去获得原始数据,并同时执行一些motion算法来提取更多的信息,然后呈献给应用层做进一步处理。Core Motion框架包含有-个专门的Manager类,CMMotionManager, 然后由这个manager去管理三种和运动相关的数据封装类,而且,这些类都是CMLogltem .类的子类,所以相关的motion数据都可以和发生的时间信息一起保存到对应文件中,有了时间戳,两个相邻数据之间的实际更新时间就很容易得到了。这个东西是非常有用的,比如有些时候,你得到的是50Hz的采样数据,但希望知道的是每- -秒加速度的平均值。从Core Motion中获取数据主要是两种方式,-种是Push,就是你提供一个线程管理器NSOperationQueue,再提供一个Block (有 点像C中的回调函数),这样,Core Motion自动在每- -个采样数据到来的时候回调这个Block,进行处理。在这中情况下,block中的操作会在你自己的主线程内执行。另-种方式叫做Pull,在这个方式里,你必须主动去像Core Motion Manager要数据,这个数据就是最近一次的采样数据。你不去要,Core Motion Manager就不会给你。当然,在这种情况下,
Core Motion所有的操作都在自己的后台线程中进行,不会有任何干扰你当前线程的行为。
Core Motion的大体介绍就是这些。下面说说Core Motion具体负责的采集,计算和处理。Core Motion的使用就是- -三部曲:初始化,获取数据,处理后事。在初始化阶段,不管你要获取的是什么数据,首先需要做的就是motionManager = [[CMMotionManager alloc] init];所有的操作都会由这个manager接管。后面的初始化操作相当直观,以加速度的pull方式为例
if (!motionManager. accelerometerAvailable) {
// fail code //检查传感器到底在设备,上是否可用
motionManager.accelerometerUpdatelInterval = 0.01; //告诉manager,更新频率是100Hz
[motionManager startAccelerometerUpdates]; //开始更新,后台线程开始运行。
这是pull方式。如果是push方式,更新的代码可以写成这样
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue
currentQueue] withHandler:^(CMAccelerometerData *latestAcc, NSError *error)
{
// Your code here
}];
接下来就是获取数据了。Again, 很简单的代码
CMAccelerometerData *newestAccel = motionManager.accelerometerData;
filteredAcceleration[0] = newestAccel.acceleration.x;
filteredAcceleration[1] = newestAccel.acceleration.y;
filteredAcceleration[2] = newestAccel.acceleration.z;
通过定义的CMAccelerometerData变量,获取CMAcceleration信息。和以前的UlAccelerometer类的使用方式一样,CMAcceleration在Core Motion中是以结构体形式定义的.
typedef struct {
double X;
double y;
double Z;
对应的motion信息,比如加速度或者旋转速度,就可以直接从这三个成员变量中得到。
最后是处理后事,就是在你不需要Core Motion进行处理的时候,释放资源
[motionManager stopAccelerometerUpdates];
//[motionManager stopGyroUpdates];
//[motionManager stopDeviceMotionUpdates];
[motionManager release];
5.新增相册处理的一系列api
相册处理工具,实现从"照片"中查看提取保存等功能.
ALAssetsLibrary
ALAsset
ALAssetsGroup
ALAssetsFilter
ALAssetRepresentation等
1.获得相册的组别(Get the list of groups that match the giventypes)
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
在这个方法的enumerationBlock中读取分组列表,包括它的名称、封面图片等等。
2.返回一个ALAsset对象(Returns an ALAsset object in the result block for a URL previously retrieved from an ALAsset object)
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
- (void)assetForURL :(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
3.和上面类似,返回一个ALAssetsGroup对象
- (void)assetForURL :(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
- (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(AL AssetsLibraryAccessFailureBlock)failureBlock
AssetsLibrary
没提供什么方法,就是一个包含其他五个类的一个头文件
ALAssetsGroup
ALAssetsGroup就是相册组的类,可以通过这个类提供的方法来获取相
册组的各种信息。
1.获得名称,类型,ID, NSURL
- (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(AL AssetsLibraryAccessFailureBlock)failureBlock
- (id)valueForProperty:(NSString *)property;
property可以是:
ALAssetsGroupPropertyName (名称)
ALAssetsGroupPropertyType (类型)
ALAssetsGroupPropertyPersistentID (ID)
ALAssetsGroupPropertyURL (NSURL)
2.获得相册分组的封面图片 - (CGImageRef)posterlmage;
注意使用:
- <span style="font-size:18px;">//获取相册group的封面
- cell.imageView.image = [Ullmage imageWithCGlmage:
[group posterlmage]]; </span>
3.过滤器
- (void)setAssetsFilter:(ALAssetsFilter *)filter
ALAssetsFilter中有这些方法,是过滤类型
1.1/ Get all photos assets in the assets group.
- (ALAssetsFilter *)allPhotos;
- // Get all video assets in the assets group.
- (ALAssetsFilter *)allVideos;
- // Get all assets in the group.
- (ALAssetsFilter *)allAssets;
4.获得相册的组的数量
- (ALAssetsFilter *)allAssets;
- (NSInteger)numberOfAssets;
5.通过相册组获取里面的图片:
- (NSInteger)numberOfAssets;
- (void)enumerateAssetsUsingBlock:
(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsUsingBlock:
- (void)enumerateAssetsWithOptions:
(NSEnumerationOptions)options usingBlock:
(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsWithOptions:
- (void)enumerateAssetsAtlndexes:(NSIndexSet *)indexSet options:
(NSEnumerationOptions)options usingBlock:
(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
一般使用第一个。
- (void)enumerateAssetsAtlndexes:(NSIndexSet *)indexSet options:
ALAssetRepresentation
1.//获取资源图片的详细资源信息
- ALAssetRepresentation* representation = [asset defaultRepresentation];
- //获取资源图片的长宽
- CGSize dimension = [representation dimensions];
- //获取资源图片的高清图
- [representation fullResolutionIlmage];
- //获取资源图片的全屏图
- [representation fullScreenlmage];
- //获取资源图片的名字
- NSString* filename = [representation filename];
- NSLog(@"filename:%@",filename);
- //缩放倍数
- [representation scale];
- //图片资源容量大小
- [representation size];
- //图片资源原数据
- [representation metadata];
- //旋转方向
- [representation orientation];
- |/资源图片url地址,该地址和AL .Asset通过AL AssetPropertyAssetURL获取的
url地址是一样的 - NSURL* url = [representation url];
- NSLog(@"url:%@" ,url);
- //资源图片uti,唯一-标示符
- NSLog( @"uti:%@",[representation UTI]);
ALAsset
照片类,这里要说的就是
- (id)valueForProperty:(NSString *)property; </span>
property有如下类型:
1.ALAssetPropertyType资源的类型(照片, 视频)
2.ALAssetPropertyLocation资源地理位置(无位置信息返回nul)
3.ALAssetPropertyDuation播放时长(照片 返回ALErorInvalidProperty)
4.ALAssetPropertyOrientation方向(共有8个方向, 参见:ALAssetOrientation)
5.ALAssetPropertyDate拍摄时间(包含 了年与日时分秒)
6.ALAssetPropertyRepresentations描述(打印看了下,只有带后缀的名称)
7.AL AssetPropertyURLs (返回一个字典,键值分别是文件名和文件的url)
8.ALAssetPropertyAssetURL文件的url
6.新增了block闭包
即OC的block语法
7.GCD
a.新增的一套API,结合了同时推出的block语法增加了如timer,dispatch_once,after,apply等功能的api
1.延时函数
2.异步操作
3.一组线程执行完毕之后执行(无序)
4.一个线程一个线程执行(有 序)
5.执行某段代码n次
6.timer
CGD(Grand Central Dispatch,大中枢派发)
GCD是苹果开发的一个多核编程的解决方法,还有两种NSThread, NSOperarion;
GCD是苹果推荐而且最简洁的;
纯C语言,提供了非常多强大的函数;
GCD会自动利用更多的CPU内核(比如双核、四核);
GCD会自动管理线程的生命周期(创建线程、 调度任务、销毁线程) ;
只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
GCD中的函数大多数都以dispatch开头
在理解GCD之前,请先理解进程,线程,同步,异步,并行,串行,队列
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并行:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
GCD的2个核心概念:
1.队列:用来存放任务
2.任务:执行什么操作
将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,任务的取出遵循队列的FIFO原则GCD的队列可以分为2大类型
1.并发队列(Concurrent Dispatch Queue)
可以让多个任务并发执行,并发功能只有在异步(dispatch_ async) 函数下才有效
2.串行队列(Serial Dispatch Queue)
让任务-个接着一个地执行
使用dispatch_ get_ main_ queue()获得 主队列,主队列是GCD自带的一种特殊的串行
队列,放在主队列中的任务,都会放到主线程中执行
注意:
iOs所有的UI操作都必须在主线程上执行
GCD提供了全局的并发队列,不需要手动创建
dispatch_ queue_ t queue =
dispatch get. _global queue(DISPATCH QUEUE PRIORITY _DEFAULT, 0);
第一个参数为优先级,第二个参数文档上说以后会用到,目前都传0即可
全,局并发队列的优先级如下
define DISPATCH_ QUEUE PRIORITY _HIGH 2 //高
define DISPATCH_ QUEUE_ PRIORITY DEFAULT 0 //默认(中)
define DISPATCH_ QUEUE_ _PRIORITY. _LOW (-2)//低
define DISPATCH_ QUEUE PRIORITY_ BACKGROUND INT16 _MIN
//后台
注意:
我们看到几乎所有的操作都是在block中进行的,此时应注意保留环也就是循环引用
的问题应避免内存溢出的情况发生,如果block有 对self引用,请使用_ _weak 去修饰self
b.新的多线程API,在某些方面也扩展了原有的NSThread和NSOperarion
8.新增imagepicker API 快捷操作相册和拍摄照片
9.OC支持正则表达式
10.新增NSCache 系列API
- NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似, 在AFN和SDWeblmage框架中被使用来管理缓存
2)苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
建议:接收到内存警告时主动调用removeAllObject方法释放对象 - NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
- NSCache的Key只是对对象进行Strong引用,不是拷贝,在清理的时候计算的是
实际大小而不是引用的大小NSCache属性和方法介绍
1)属性介绍
name:名称
delegete:设置代理
totalCostLimit:缓存空间的最大总成本,超出,上限会自动回收对象。默认值为0,表示没有限制
countLimit:能够缓存的对象的最大数量。默认值为0,表示没有限制evictsObjectsWithDiscardedContent:标识缓存是否回收废弃的内容
2)方法介绍
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)keycost:(NSUInteger)g;
//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本
//当出现内存警告或者超出缓存总成本.上限的时候,缓存会开启一个回收过程,删
除部分元素 - (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
- (void)removeAllObjects;//删除缓存中所有的对象
11.新增gamekit
12.支持自定义键盘
网友评论