iOS应用程序一般还是出于好编写的代码系统框架(system
frameworks)组成,系统框架提供部分基本infrastructure给拥有app来运行,而而提供自己修的代码来定制app的外观以及作为。因此,了解iOS
infrastructure和它如何做事针对性编写app是挺有拉的。

1.0 非阻塞队列

在达成篇被,我们说到了绿灯队列,以及阻塞队列中的几乎独实现类似。

本篇,我们继续针对班进行研讨。而今天的主题,则是非阻塞队列!在非阻塞队列中,ConcurrentLinkedQueue是任重而道远代表。

前面,我们了解了啊是死队列,在这我们重简单地想起下!

啊是死队列?

卡住,顾名思义:当我们的劳动者向行中生产数量时,若队列已满,那么生产线程会暂停下来,直到队列中产生可以存放数据的地方,才会持续工作;而当我们的主顾为行中获取数据时,若队列为空,则消费者线程会暂停下来,直到容器中有素出现,才会进行得操作。

当下虽是死队列。

那么,非阻塞队列又是什么意思呢?

什么是非阻塞队列?

跟死队列相反,非阻塞队列的实践并无见面给死,无论是消费者之出队,还是劳动者的入队。

每当底部,非阻塞队列使用的凡CAS(compare and set)来实现线程执行之非阻塞。

非阻塞队列的操作

跟死队列相同,非阻塞队列中之常用方法,也是出队及入队。

入队方法:

add():底层调用offer();

offer():Queue接口继承下来的方法,实现队列的入队操作,不会阻碍线程的执行,插入成功返回true;

出队方法:

poll():移动头结点指针,返回头结点元素,并将头结点元素出队;队列为空,则返回null;

peek():移动头结点指针,返回头结点元素,并不会将头结点元素出队;队列为空,则返回null;

脚,我们实际说生ConcurrentLinkedQueue的规律,以及落实!

ConcurrentLinkedQueue

ConcurrentLinkedQueue是一个线程安全之班,基于链表结构实现,是一个无界队列,理论及吧队列的长可以无限扩大。

同其它队相同,ConcurrentLinkedQueue也用的是先进先出(FIFO)入队规则,对素进行排序。当我们为行中补充加元素时,新栽的因素会插入到队的尾;而当我们得一个元素时,它会于队列的头颅遭遇取出。

因ConcurrentLinkedQueue是链表结构,所以当入队时,插入的素依次向后延伸,形成链表;而出队时,则从链表的第一只元素开始取,依次递增;

非晓得,我这么勾画能否被你针对链表的入队、出队生一个大约的思路!

简单用

值得注意的是,在用ConcurrentLinkedQueue时,如果波及到行列是否为空的判断,切记不可采用size()==0的做法,因为在size()方法中,是由此遍历整个链表来实现的,在班元素很多之时节,size()方法好吃性能及日,只是一味的判断队列为空使用isEmpty()即可!!!

public class ConcurrentLinkedQueueTest {

    public static int threadCount = 100000;

    public static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();

    static class Offer implements Runnable {
        public void run() {
            if(queue.size()==0){
                String ele = new Random().nextInt(Integer.MAX_VALUE)+"";
                queue.offer(ele);
                System.out.println("入队元素为"+ele);
            }
        }
    }

    static class Poll implements Runnable {
        public void run() {
            if(!queue.isEmpty()){
                String ele = queue.poll();
                System.out.println("出队元素为"+ele);
            }
        }
    }

    public static void main(String[] agrs) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        for(int x=0;x<threadCount;x++){
            executorService.submit(new Offer());
            executorService.submit(new Poll());
        }
        executorService.shutdown();
    }
}

下卷中,我们详细来介绍ConcurrentLinkedQueue的平底实现。

引言:以作者研究源码时,发现无论是idea,还是eclipse,在debug模式下,跟踪ConcurrentLinkedQueue源码时都见面来bug,具体情况就是debug控制台中类的内存地址和实际的内存地址不平等,导致代码在debug执行时并无会见随正规逻辑来实施。

详细描述,可参看如下内容:神乎其神的控制台

釜底抽薪方案:将ConcurrentLinkedQueue源码拷出,本地新建一个看似,使用run执行,在措施的上下增加自己之出口语句,打印出实际的内存地址,便可同等探究竟。如果您切莫思量对源码进行修改,只想就此debug模式,建议用拷贝源码中的ConcurrentLinkedQueue的持续和兑现清一色去丢,形式如下:public
class
ConcurrentLinkedQueue<E>
,这样为堪包debug模式之例行运作。

Main函数入口

具因C编写的app的入口都是main函数,但iOS应用程序有点不同。不同便是公免待也iOS应用程序而自己修main函数,当你用Xcode创建工程的下就是已提供了。除非有独特情形,否则你不应该修改Xcode提供的main函数实现。示例代码如下:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    } 
}

方实例代码中发生一个万分重点之函数UIApplicationMain,它要是创造app的几个基本目标来拍卖以下过程:

  1. 从可用Storyboard文件加载用户界面
  2. 调用AppDelegate于定义代码来举行有初始化设置
  3. 将app放入Main Run Loop条件受到来响应与拍卖和用户交互产生的事件

应用程序的架构

iOS应用程序都循Model-View-Controller的架构,Model承担储存数据以及处理事情逻辑,View肩负显示数据和及用户交互,Controller凡是两岸的中介,协调ModelView相互协作。它们的简报规则如下:

  1. Controller会访问ModelViewModelView莫克互相访问

    MVC Communication – Reference from Stanford University.png

  2. View与用户交互产生事件频仍,使用target-action主意来拍卖

    MVC Communication – Reference from Stanford University.png

  3. View待处理局部特殊UI逻辑或获取数据源时,通过delegatedata source法提交Controller来处理

    MVC Communication – Reference from Stanford University.png

  4. Model匪可知一直和Controller通信,当Model生数量更新时,可以由此NotificationKVO (Key Value Observing)来通知Controller更新View

    MVC Communication – Reference from Stanford University.png

叩问iOS的MVC设计模式之后,我们从下图来打听在MVC模式下iOS应用程序有哪最主要目标暨它们职责重中之重是什么?

The Structure of an App.png

  • UIApplication对象
    用户与iOS设备交互时发出的风波(Multitouch Events,Motion
    Event,Remote Control Event)交由UIApplication对象来散发给control
    objects
    (UIControl)对应的target
    objects
    来拍卖又管理整个事件循环,而部分有关app运行时要事件委托为app delegate来处理。

  • App
    delegate对象
    App delegate目标仍UIApplicationDelegate协和,响应app运行时主要事件(app启动、app内存不足、app终止、切换到其他一个app、切回app),主要用于app在起步时初始化一些着重数据结构;例如,初始化UIWindow,设置有些性,为window添加rootViewController

  • View
    controller对象
    View Controller有一个view性能是view层次结构中之根view,你可补充加子view来构建复杂的view;controller有一部分viewDidLoadviewWillAppear对等艺术来管理view的生命周期;由于它们延续UIResponder,所有还见面应和拍卖用户事件。

  • Documents和data
    model对象
    data
    model
    靶主要为此来存储数据。例如,饿了么app在摸索切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和显示搜地址历史。
    document对象(继承UIDocument)用来保管有些或者具有的data
    model对象。document对象并无是须的,但提供相同种植有益的艺术来分组属于单个文件要多只文本的数目。

  • UIWindow对象
    UIWindow对象在view层次结构中的绝顶层,它当一个主干容器而无显得内容,如果想展示内容,添加一个content
    view到window。
    它们也是继续UIResponder,所以它呢是会见应与处理用户事件。

  • View、control、layer对象
    View目标足以透过addSubview和removeFromSuperview
    等艺术管理view的层次结构,使用layoutIfNeeded和setNeedsLayout等方法布局view的层次结构,当您发觉系统提供view已经满足不了卿想如果的外观需求时,可以再次写drawRect方法或者通过layer属性来组织复杂的图表外观以及卡通片。还有某些,UIView也是继承UIResponder,所以呢能处理用户事件
    Control靶日常就是处理特定项目用户交互的View,常用的有button、switch、text
    field等。
    除去行使ViewControl来构建view层次结构来震慑app外观之外,还可采用Core
    Animation框架的Layer目标来渲染view外观和构建复杂的卡通。

Main Run Loop

一个iOS应用程序的main run
loop
重中之重作用是处理所有和用户相关的事件。UIApplication目标在启动时虽装main
run loop和动用它们来处理事件和更新基于view的界面。正使她名字所示,main run
loop是运行在应用程序的主线程。这样便管与接纳到用户相关的事件为有序地处理。

下图显示main run
loop的架构和用户事件最终是哪让应用程序处理。当用户以及设备交互时,系统即见面转和互动关联的波,然后给应用程序的UIKit通过一个特别之端口来散发。应用程序把事件放入队列,然后逐个分发到main
run
loop来执行。UIApplication目标是第一独对象收取及事件,然后决定哪些处理它。一个touch
event
寻常还于分发及main
window对象,然后挨家挨户分发到来触碰的view。其他event的收事件目标路径可能有硌不同。

Main Run Loop from Apple Document

大部分底事件经过行使main run
loop来散发,但有点不是。有些事件于发送到一个delegate对象或传递及你提供的block中。想了解又多安处理大多数类型的波,其中包括touch、remote
control、motion、accelerometer和gyroscopic等事件,请查阅Event Handle
Guide for
iOS。

应用程序的状态及多任务

奇迹系统会从app一种植状态切换其他一样种状态来响应系统产生的波。例如,当用户按下home键、电话打入、或外中断发生时,当前运行的应用程序会切换状态来响应。应用程序的状态产生以下几种植:

App State from Apple Document

  • Not running:app还没有运行
  • Inactive:app运行在foreground但绝非收受事件
  • Active:app运行在foreground和着接受事件
  • Background:运行于background和正在实施代码
  • Suspended:运行于background但不曾履行代码

绝大多数出状态转换时犹见面调用delegate目标对应的计来响应app的状态改变。下面汇总了delegate对象的所有方,当app状态有转移时,你恐怕会见用到它。

  • application:willFinishLaunchingWithOptions:
    这个法子是若当起步时的第一次于会来执行代码
  • application:didFinishLaunchingWithOptions:
    这个点子允许而于显示app给用户之前实施最后的初始化操作
  • applicationDidBecomeActive:
    app已经切换至active状态后要执行的操作
  • applicationWillResignActive:
    app将要从前台切换到后台时需要实践的操作
  • applicationDidEnterBackground: – app已经进入后台后需履行的操作
  • applicationWillEnterForeground:
    app将要从后台切换到前台要实施之操作,但app还免是active状态
  • applicationWillTerminate: – app将要结束时需要履行之操作

现今讲下app启动、来回切换app和锁屏时状态的切换和调用对诺什么delegate对象的法门:

  • app启动和active/inactive

    Launch and active/inactive from Apple WWDC 2011 Session

如图所示,当app启动时,首先由`not running`状态切换到`inactive`状态,此时调用`application:didFinishLaunchingWithOptions:`方法;然后由`inactive`状态切换到`active`状态,此时调用`applicationDidBecomeActive:`方法。

Launch and active/inactive 2 from Apple WWDC 2011 Session

当app发生中断时,由active状态切换至inactive状态,此时调用applicationWillResignActive:方法。

  • 来回切换app

    Switch from an app from Apple WWDC 2011 Session

如图所示,当切换到另一个app时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`方法;然后从`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

Switch to an app from Apple WWDC 2011 Session

一经当切换回本来之app时,由running状态切换到inactive状态,此时调用applicationWillEnterForeground:方法,然后由inactive状态切换到active状态,调用applicationDidBecomeActive:方法。

  • 锁屏

    Device lock from Apple WWDC 2011 Session

如何所示,当手机锁屏时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`;然后再由`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

再多关于app状态切换以及调用app delegate怎么样方法,请看WWDC 2011
Session的session_320__adopting_multitasking_in_your_app视频。

应用程序的停

网时是为外app启动时由于内存不足而回收内存最后索要停止应用程序,但偶尔也会见是出于app很丰富时才应而偃旗息鼓。如果app当时运行在后台并且没有刹车,系统会以应用程序终止前调用applicationWillTerminate:来保存用户之有些重大数据以便下次启动时回升到app原来的状态。

总结

本文总结了iOS应用程序从启动至了过程中发出哪主要目标在参与,以及当用户和网相互时起事件时,系统以main
run
loop来治本事件循环,决定将事件交给系统如何对象处理同怎样处理。而当app启动、来回切换app和锁屏时,app的状态怎么样切换和调用对应之怎么app delegate对象来拍卖。

扩张阅读

App Programming Guide for
iOS
Developing iOS 7 App for iPhone and
iPad
深刻明RunLoop
Objective-C Autorelease Pool
的兑现原理

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图