天天看點

01 類目Category、延展Extension、協定Protocol、計數器的使用NSTimer

一、類目Category

*怎樣為類添加一個方法:

  • 修改源代碼
  • 編寫此類的子類

*OC中常見的擴充方式:

  • 類目Category、延展Extension、協定Protocol

1、介紹:

  • 類目可以為一個現有的類添加新的方法
  • 類目與原類同級,是原始類的一部分,方法也同級
  • 類的類目新增的方法可以它的子類繼承

2、注意事項

  • 類目中隻能寫方法,不能添加成員變量
  • 同一個類可以添加多個類目,但不能重名
  • 可以覆寫現有類的方法,原方法不能被調用

3、類目的建立

  • command + N  >>  OS X 中 Objective-C File  >>  File Type 選擇 類目Category。

4、多重類目

  • 多重類目不要重寫一個方法,如果重寫了同一個方法,那麼系統隻調用重寫後 友善調用的那個方法。

5、類目中方法的建立,和類中一樣。隻是沒有執行個體變量(屬性)

二、延展Extension

*、介紹

  • 在類的實作檔案中定義的類目,叫做延展
  • 延展是匿名的類目,定義“私有”的方法
  • @interface  延展名 ()       //小括号裡可寫可不寫
  • @end
  • 主要用來介紹 目前檔案内哪些是閉源的 (閉源就是不通路,“私有的”,隻有實作沒有聲明的)
  • 寫在 .m 檔案中,需要遵循 OC 書寫規則。而 單獨建立的的延展.h檔案 沒有文法檢查

三、協定Protocol

1、概述

  • 協定聲明了可被其他的類實作的方法
  • 協定不是類,隻是一個其他類實作的接口

2、協定的建立與簽訂

  • @protocol 協定名    <必須遵守的協定>       ————(協定名稱必須唯一)
  • @protocol Protocol <NSObject>      
  • @required  (預設類型)   放在方法聲明前面,用來修飾必須實作的方法 。
  • @optional   可以選擇實作的方法
  • @end   (結束)

3、協定的采用: 必須将協定的頭檔案 導入需要實作方法的目标類的頭檔案内,并<留名> 簽訂

  1. Tiger 采用 ZooRule協定
    • #import"ZooRule.h"

      @interface Tiger :NSObject <ZooRule>   //簽訂協定<協定名>

  2. 假如Tiger類 要同時采用兩個協定
    • @interface Tiger :NSObject <ZooRule,ManagerRule>
    • 在協定中聲明的方法,在類的 .h檔案中就沒必要再聲明了。
    • 在實作檔案檔案中用 下列标記,友善程式的閱讀與修改
    • 加注釋方法:
    • #pragma mark -協定中@required
    • #pragma mark -協定中@optional

      3、協定的作用

  • 協定寫有達到某種功能所有需要的方法,而每個類可能隻需要實作其中少數的幾條方法。隻有全部實作才能獲得一系列的有用功能

4、協定和資料類型

  • 你可以在使用的資料類型中為執行個體變量和方法參數指定協定名稱;
  • 如:id 類型表示一個可以指向任何類型的對象的指針,它是泛指對象類型。如果用一個尖括号<>括起來的協定名稱跟随在id 之後,則編譯器(或讀者)将知道你期望任意類型的對象,隻要遵守該協定。id<Delegate> _argent;

四、計數器的使用

1、TimerInterval:時間戳,每隔幾秒調用一次。double 類型資料 2、target:調用方法的對象 3、selector:需要被調用的方法 4、userInfo:id  類型的使用者資訊,用以區分,在KVO會詳細講。可使用 nil 5、repeats:是否重複: YES /NO

  •     [NSTimerscheduledTimerWithTimeInterval:2
  •                                     target:self
  •                                   selector:@selector(test:)
  •                                   userInfo:@“Hello"
  •                                    repeats:YES];
  •     - (void)test:(NSTimer *)timer {
  •          id userInfo = timer.userInfo; //接收userInfo 資訊
  •          [timerinvalidate]; //終止定時器
  •      }

6、讓程式讀到此處停下,但還在運作,直到某一個時間,再繼續往下運作

  •    NSDate *date = [NSDatedateWithTimeIntervalSinceNow:10];
  •     [[NSRunLoopcurrentRunLoop]runUntilDate:date];

7、讓程式一直運作在此處逗留

  •     //    [[NSRunLoop currentRunLoop]run];