分類 協議 延展 block

2021-07-22 05:39:14 字數 3883 閱讀 8708

分類的簡單使用

- 什麼是分類

- 當乙個類包含了非誠多的術語不同範疇的方法的時候 我們通常將這個類分為多個檔案來實現,其中乙個類叫主類/本類其餘的叫分類

- 有了分類之後 乙個類 = 所有分類 + 本類

- 如何新增分類

- newfile–> 選中oc file–>選擇category—>填寫分類名,本類名

- 分類的宣告

@inte***ce 本類名 (分類名)

@end

@implementation 本類名 (分類名)

@end

* 分類的使用注意*

- 在分類中不能寫屬性,只能寫方法的宣告和實現

- 在分類中用@property也是可以的

- 但是即使使用了 @property 也不會生成屬性,只會生成getter和getter方法的宣告(不包含實現)

- 在分類中可不可以訪問本類的中的屬性? 可以

- 在分類中 不能直接訪問本類中的真私有屬性,但是通過getter各setter方法來訪問本類的真私有屬性

- 本類中的方法和本類的方法能不能同名? 可以

- 這個時候 不管有沒有引入分類 都會呼叫分類的方法

- 如果多個分類中有同名的方法 只會呼叫最後邊編譯的那個分類中的方法

- 怎麼看那個分類是最後編譯的?

選中專案—>選中target—>build phase–>編譯源(compile source)–>在此修改順序即可

非正式協議

- 其實非正式協議就是乙個分類,是為系統類新增的分類

延展的基本使用

- 延展是什麼?

- 乙個特殊的分類:

- 是乙個匿名的分類(就是乙個分類沒有名字)

- 在延展中可以有屬性,但是只有方法的宣告,而沒有方法的實現(方法的實現在本類的.m檔案中)

- 如何寫乙個延展

@inte***ce 本類名 () // 小括號中什麼都不寫 就是延展

@end

延展(沒有名字)

延展的基本使用

- 延展的作用: 生成私有的@property和私有方法

- @property 會生成屬性,方法的宣告,方法實現

- 什麼是私有的@property? 就是生成的屬性,方法的宣告和實現都不讓外界訪問

- 怎麼辦?

- 在.m中 可以寫乙個延展,然後把@property 寫到延展裡 這樣生成的_屬性名,getter和setter方法的宣告都在.m檔案中

- 延展如何使用?

- 大部分的情況下,延展都會寫在本類的.m檔案中,而且是寫到最上面

- 然後可以在延展中寫屬性的方法,這些屬性和方法都是私有的成員

- 總之:

- 延展就是用來私有化成員的,只要你想寫乙個私有的成員(屬性,方法)

- 寫到延展中

block變數的宣告

- block是乙個資料型別,它的變數可以存 一段符合要求的**

- block變數的宣告:

返回值型別 (^變數名)(引數列表);

*** (^ttt)(*** a,ooo b);

宣告了乙個block型別的變數, 變數名字叫做ttt;

ttt可以儲存 返回值型別是 *** 有乙個***型別的引數 乙個ooo型別的引數

block變數賦值初始化

- 寫乙個block**塊的格式

^返回值型別(引數列表)
- 寫乙個**塊 求2個整數的和

^int(int num1,int num2);

寫乙個**塊 求2個整數的最大值

^int(int num1,int num2);

3.儲存上面的2個**塊

3.1>//第一種

int (^blocksum)(int num1,int num2);//定義了乙個變數

blocksum = ^int(int num1,int num2);

//第二種

int (^blocksum)(int num1,int num2) = ^int(int num1,int num2);

3.2>//第一種

int (^blockmax)(int num1,int num2);//定義了乙個變數

blockmax = ^int(int num1,int num2);

//第二種

int (^blockmax)(int num1,int num2) = ^int(int num1,int num2);

block 使用 typedef的簡化 定義

- typedef 的作用是?

- 為乙個已經存在的資料型別,起乙個 別名

- 使用typedef簡化block的定義

- typedef的基本使用

typedef long int lint;

int nums1[4];//int[4] nums1;

int nums2[4];//int[4] nums2;

typedef int num[4];

num nums3;//等價於 int nums3[4];

- typedef簡化block的定義

「` void (^blockname)(int,int);

//void (^)(int,int) blockname;==>*** a;

語法格式:

// typedef void (^)(int,int) newtype;

typedef 返回值型別 (^新型別名字)(引數列表);

typedef void (^newtype)(int,int);

這個newtype就是新型別的名字

就可以通過newtype 來定義block變數

newtype block1,block2;

**block訪問外部變數的問題**

-block**段內部,可以定義和玩不變數名字相同的變數

-在block**段的內部

-可以訪問外部的全域性變數和區域性變數的值

-可以修改全域性變數和自己的區域性變數的值 但是不能修改外部區域性變數的值

-如果非要修改 就子啊外部的區域性變數的值 定義的時候前面加上 __block修飾

**block作為函式的引數**

-block作為函式的引數的寫法

void test(返回值型別 (^變數名)(引數列表1,引數列表2))

//第二種

typedef void (^newtype)(int num1,int num2);

void test(newtype block1)

- 呼叫這個函式的終極方法

1>定義乙個block變數 給他賦值

newtype block2 = ^void(int num1,int num2);

2>呼叫函式

test(block2);

3>終極版

test(^void(int num1,int num2));//有乙個小技巧,呼叫函式的時候 如果需要傳遞**塊,只需要敲回車鍵,自動新增**塊的格式

- "注意:定義block變數的時候,block內的**不會執行

"block內的**只有在呼叫block的時候才執行

類目 延展 協議

1.類目 類目就是為已存在的類新增新的方法。但是不能新增例項變數。比如系統的類,我們看不到他的.m檔案,所以沒有辦法用直接新增方法的方式去實現。inte ce nsmutablearray sort 為nsmutablearray類新增sort方法,sort就是類目名,做到見名知意 void inv...

延展 協議 類目

一.延展 1.延展以 inte ce開頭,然後寫當前延展的類名,類名後加乙個 到 end結束 2.一般延展會寫在自己寫的.m檔案中,把一些不想讓外部呼叫的屬性放在延展裡,這樣這條屬性只能夠在類的內部使用,外部使用不了,盡最大可能保護當前類的安全 3.類目一般是給看不見.m的檔案進行擴充套件,延展一般...

類目, 延展, 協議

1.類目 類目就是為已存在的類新增新的方法。但是不能新增例項變數。比如系統的類,我們看不到他的.m檔案,所以沒有辦法用直接新增方法的方式去實現。inte ce nsmutablearray sort 為nsmutablearray類新增sort方法,sort就是類目名,做到見名知意 void inv...