iOS中的事件響應鏈、單例模式、工廠模式、觀察者模式

學習內容

歡迎關注個人iOS學習總結——天天學一點iOS:https://github.com/practiceqian/one-day-one-iOS-summaryios

iOS中事件傳遞和相應機制

  1. iOS中的事件(主要有三類)git

    • 觸摸事件(touch Event)
    • 運動/加速計事件(motion Event)
    • 遠程控制事件(remote-control Event)
  2. UIResponder(響應者對象)github

    • iOS中只有繼承了UIResponder的類才能接收並處理事件,稱之爲響應者對象。objective-c

    • 爲何繼承了UIResponder的類都可以接收並處理事件呢?設計模式

      • //UIResponder類提供瞭如下四個對象方法來處理觸摸事件
        - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
        - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
        - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
        - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
  3. 事件響應鏈安全

    • 全部處理事件響應的類都是UIResponder的子類,響應者鏈是一個由不一樣對象組成的層次結構,其中的每一個對象依次得到響應事件消息的機會,事件將沿着響應者鏈一直向下傳遞,直到該事件被接收而且處理ide

    • 事件的傳遞和響應鏈函數

      //事件傳遞是從第一響應者->UIApplication
      View->ViewController->UIWindow->UIApplication->nil
      //事件的響應是從UIApplication->FirstResponder
      UIApplication->UIwindow->ViewController->View
      • 能夠經過[responder nextResponder]找到當前responder的下一個responder,持續這個過程,最後會找到UIApplication對象
      • 一般狀況下,在first responder(即用戶所點擊的view)就會處理事件請求,進入事件分發機制
    • 幾種繼承關係性能

      • UIWindow->UIView->UIResponder
      • UIApplication->UIResponder
  4. 事件分發機制學習

    • 第一響應者指的是當前接受觸摸的響應者對象(一般是一個UIView對象),表示當前對象正在與用戶進行交互,它是響應鏈的開端,響應鏈和事件分發機制都是爲了找出第一響應者
    • 當發生觸摸操做後,系統會將該操做打包成一個UIEvent對象,並將其放入當前活動Application的事件隊列(隊列的特色是先進先出,先發生的事件先處理)
    • UIApplication會從事件隊列中取出事件並將其分發給當前應用的UIWindow對象
    • UIwindow對象首先會使用hitTest:withEvent:方法尋找該觸摸事件發生時所在的視圖,histTest->view
    • hitTest:withEvent:方法的處理流程
      • 調用pointInside:withEvent:方法判斷觸摸點是否在當前視圖內
      • 若是返回no,則hitTest方法返回nil,若是返回yes,則向當前視圖的全部子視圖發送hitTest:withEvent消息
      • 若是第一次有子視圖返回非空對象,那麼UIWindow對象調用的histTest:withEvent(UIWindow繼承自UIView,UIView含有hitTest方法)方法返回該對象,若是全部的子視圖都返回nil,那麼histTest:withEvent方法返回自身
    • 若是histTest:withEvent方法沒有找到第一響應者或者第一響應者沒有處理該事件,那麼該事件就會沿着響應者鏈向上回溯,若是UIWindow對象和UIApplication對象都不能處理該事件,那麼該事件就會被丟棄。
    • 若是對事件響應須要有特殊的操做,那麼能夠重寫hisTest:withEvent方法來實現
    • UIView(或者繼承自UIView的子類)不能接收觸摸事件的三種狀況
      • UIView的userInteractionEnabled設置爲NO(不可交互)
      • UIView的hidden設置爲YES(隱藏了UIView,父控件隱藏的話子控件也會被隱藏)
      • alpha透明度<0.01(0~0.01)爲透明
  5. UIApplication的幾種狀態

    • not Running(程序未啓動狀態)
    • Inactive(未激活)程序在前臺運行,可是沒有接收到事件,在沒有事件須要處理的狀況下程序一般處於這個狀態
    • active(激活)程序在前臺運行,而且接收到了事件
    • Background(後臺),程序在後臺運行而且能夠執行代碼,大多數程序掛起到後臺都會在這個狀態停留一會,一段時間後會進入掛起(Suspended)狀態,通過特殊處理的請求能夠長期處於這個狀態。
    • Suspended(掛起),程序在後臺運行可是不能執行代碼,系統自動把程序變成這個狀態而且不會發出通知,可是還在內存中運行,當系統遇到內存壓力時,就會自動將程序從內存中清除,爲前臺程序提供更多的內存。

iOS中的設計模式

  1. 設計原則

    • 單一職責原則
      • 一個類只承擔一個職責,若是一個類擁有了兩種職責,那麼須要考慮是否將這個類拆分開來,好比UITableViewCell,若是有多重樣式的cell,那麼咱們應該考慮的是分紅幾種類型的cell去寫,而不是在一個cell中實現多種類型
    • 開閉原則
      • 對軟件實體的修改,最好使用擴展而非直接修改的方式
      • 對類,函數,若是須要修改,儘可能採用繼承的方式來擴展類的功能,而不是直接修改類的代碼(若是工程不是特別複雜的狀況下,那麼直接修改類的代碼也能夠)
    • 裏式替換原則
      • 子類能夠擴展父類的方法,但不該該重寫父類的方法
    • 接口隔離原則
      • 對象不該被強迫依賴它不使用的方法
    • 依賴倒置原則
      • 高層模塊不該該依賴底層模塊,兩者都應該依賴其抽象,抽象不該該依賴細節,細節應該依賴抽象
    • 迪米特法則
      • 一個對象對另外一個對象瞭解的越多,那麼他們的耦合度就越高,當修改一個對象時,對另外一個對象的影響就越大(一個對象應該對另外一個對象保持最少的瞭解,儘可能實現低耦合高內聚)
    • 組合/聚合複用原則
      • 儘可能使用合成/聚合,在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分,新的對象經過對這些對象的委派達到複用已有功能的目的(儘可能使用合成/聚合,不要使用繼承)
  2. iOS開發中幾種經常使用的設計模式

    • 單例模式(兩種實現方法)

      • //使用@synchronized保證線程安全的懶加載寫法,可是因爲@synchronized是互斥鎖致使性能比較低
        + (Singleton *)sharedInstance { 
            @synchronized (self) {
                if (!instance) { 
                    instance = [[Singleton alloc] init];
                } 
            }
            return instance; 
        }
        //使用GCD中的dispatch_once寫法,同時知足了線程安全和靜態分析器的要求
        + (Singleton *)sharedInstance { 
            static dispatch_once_t predicate;
            dispatch_once(&predicate, ^{
                instance = [[Singleton alloc] init];
            });
            return instance; 
        }
      • 以上兩種單例模式的實現都不能保證SingleTon是惟一的,由於經過[[Single alloc]init]方式建立仍然會建立出新的實例

      • 建立絕對單例的方法

        //經過攔截alloc方法來建立絕對單例
        //new->alloc
        //alloc->allocWithZone
        //alloc方法的內部就是調用了allocWithZone方法,allocWithZone方法的做用就是申請空間建立對象並將建立的對象返回。
        + (instancetype)shareInstance
        {
            if (instance == nil) {
                static dispatch_once_t once;
                dispatch_once(&once, ^{
                    instance = [[Singleton alloc] init];
                });
            }
            return instance;
        }
        
        + (instancetype)allocWithZone:(struct _NSZone *)zone
        {
            if (instance == nil) {
                static dispatch_once_t onceToken;
                dispatch_once(&onceToken, ^{
                    instance = [super allocWithZone:zone];
                });
            }
            return instance;
        }
    • 工廠模式

      • //一個工廠類須要執行多個方法,能夠將每一個方法衍生出一個類繼承自這個工廠類,實例化工廠類時根據傳入的參數建立對應方法的實例
        @implementation OperationFactory
        
        + (Operation *) createOperat:(char)operate{
            Operation *oper = nil;
            switch (operate) {
                case '+':
                {
                    oper = [[OperationAdd alloc] init];
                    break;
                }
                case '-':
                {
                    oper = [[OperationSub alloc] init];
                    break;
                }
                case '*':
                {
                    oper = [[OperationMul alloc] init];
                    break;
                }
                case '/':
                {
                    oper = [[OperationDiv alloc] init];
                    break;
                }
                default:
                    break;
            }
            return oper;
        }
        @end
    • 委託模式(這裏只列出使用步驟,A爲委託對象,B爲代理對象)

      • 類A接口爲文件中建立協議,聲明@requeired和@optional方法

      • 類A添加一個屬性,使用weak修飾(不然會形成循環引用)

        @property (nonatomic,wead) id<協議名>delegate

      • 類B接口文件/類擴展中遵照協議,並在實現文件中實現協議的required/optional方法

      • 類B中建立一個類A對象,類A對象的delegate設置爲self(類B自身)

      • 在類A對象中調用[self.delegate 方法]

    • 觀察者模式(兩種方式)

      • 使用NSNotification通知實現
      • 使用KVO(key,value,observer)鍵值觀測實現
相關文章
相關標籤/搜索