美文网首页
历代iOS版本 — iOS4

历代iOS版本 — iOS4

作者: Trigger_o | 来源:发表于2020-04-23 12:03 被阅读0次

    正式由iPhone OS改名为IOS

    新增了以下特性和API

    1.多任务
    这个自然不用多说,招牌特性具体细节是这样,点了home键之后,运行的程
    序并没有被彻底关掉,而是进入到suspended状态就像虚拟机被暂停- -样,数据和状
    态都在,只是被freezed,可以随时恢复,当然也有可能随时被彻底干掉,比如在内存低的
    状况下.所以被suspended应用要随时准备着就义.那么这个多任务究竟体现在哪里
    呢?
    a.在进入休眠状态之前可以申请很短的时间,保存一些数据或者干点什么坏事.
    b.可以向系统申请一段时间小范围的复活一下,执行一些动作
    c.可以向系统注册local notification,说白了就是订个闹钟,在某特定时间或者特定
    事件跳出一个类似push notification的东西提醒用户.

    1. local notification
      简单说就是你的app可以在系统中设定一个特定时间或者事件
      的提醒,就算你的app完全没有被启动也可以.push notification的local版本
      uiapplication新增了local notification的相关api

    3.eventkit
    简单的说就是你的应用现在有办法向用户的calander添加一个事件

    1. 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)assetForURL :(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
        3.和上面类似,返回一个ALAssetsGroup对象
      • (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(AL AssetsLibraryAccessFailureBlock)failureBlock
        AssetsLibrary
        没提供什么方法,就是一个包含其他五个类的一个头文件
        ALAssetsGroup
        ALAssetsGroup就是相册组的类,可以通过这个类提供的方法来获取相
        册组的各种信息。
        1.获得名称,类型,ID, NSURL
    • (id)valueForProperty:(NSString *)property;
      property可以是:
      ALAssetsGroupPropertyName (名称)
      ALAssetsGroupPropertyType (类型)
      ALAssetsGroupPropertyPersistentID (ID)
      ALAssetsGroupPropertyURL (NSURL)
      2.获得相册分组的封面图片
    • (CGImageRef)posterlmage;
      注意使用:
    1. <span style="font-size:18px;">//获取相册group的封面
    2. 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;
    1. // Get all video assets in the assets group.
      • (ALAssetsFilter *)allVideos;
    2. // Get all assets in the group.
      • (ALAssetsFilter *)allAssets;
        4.获得相册的组的数量
      • (NSInteger)numberOfAssets;
        5.通过相册组获取里面的图片:
      • (void)enumerateAssetsUsingBlock:
        (ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
      • (void)enumerateAssetsWithOptions:
        (NSEnumerationOptions)options usingBlock:
        (ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
      • (void)enumerateAssetsAtlndexes:(NSIndexSet *)indexSet options:
        (NSEnumerationOptions)options usingBlock:
        (ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
        一般使用第一个。

    ALAssetRepresentation
    1.//获取资源图片的详细资源信息

    1. ALAssetRepresentation* representation = [asset defaultRepresentation];
    2. //获取资源图片的长宽
    3. CGSize dimension = [representation dimensions];
    4. //获取资源图片的高清图
    5. [representation fullResolutionIlmage];
    6. //获取资源图片的全屏图
    7. [representation fullScreenlmage];
    8. //获取资源图片的名字
    9. NSString* filename = [representation filename];
    10. NSLog(@"filename:%@",filename);
    11. //缩放倍数
    12. [representation scale];
    13. //图片资源容量大小
    14. [representation size];
    15. //图片资源原数据
    16. [representation metadata];
    17. //旋转方向
    18. [representation orientation];
    19. |/资源图片url地址,该地址和AL .Asset通过AL AssetPropertyAssetURL获取的
      url地址是一样的
    20. NSURL* url = [representation url];
    21. NSLog(@"url:%@" ,url);
    22. //资源图片uti,唯一-标示符
    23. 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

    1. NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似, 在AFN和SDWeblmage框架中被使用来管理缓存
      2)苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
      建议:接收到内存警告时主动调用removeAllObject方法释放对象
    2. NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
    3. 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.支持自定义键盘

    相关文章

      网友评论

          本文标题:历代iOS版本 — iOS4

          本文链接:https://www.haomeiwen.com/subject/dgkoihtx.html