簡介
- 協(xié)議
- 在協(xié)議中聲明方法和屬性,在遵守此協(xié)議的類中實現(xiàn)協(xié)議中聲明的方法瓣铣。在iOS開發(fā)中常用于代理設(shè)計模式答朋,實現(xiàn)MVC。
- 分類
- 分類不需要創(chuàng)建其子類繼承擴展類的方法棠笑。分類中的方法會成為類的組成部分梦碗,并且會被其子類繼承。常用于增加類的功能或按功能劃分幾個分類文件腐晾,模塊化設(shè)計類叉弦,使得類不顯得那么臃腫。
- 理論上分類不可以聲明成員變量藻糖,但因為Objective-C擁有動態(tài)特性的淹冰,使用runtime為分類聲明一個成員變量。
- 類擴展
- 被視為一種匿名分類巨柒,被聲明的方法必須在對應的類的@implementation中實現(xiàn)樱拴,一般在.m文件中實現(xiàn)。
- 可以在類擴展中聲明成員變量洋满、成員屬性晶乔、成員方法,并且都是私有的牺勾,子類不可以繼承正罢。
- 在iOS開發(fā)中,常用于屬性聲明及@outlet連線獲取界面UI控件驻民,不被外界訪問翻具。
1.分類
- 為KNZPerson類添加一個分類KNZDrink,擴展它的方法
Snip20161008_23.png
- 生成KNZPerson+KNZDrink.h和KNZPerson+KNZDrink.m文件
Snip20161008_24.png
- 在KNZPerson+KNZDrink.h中聲明一個方法-(void)drink,在KNZPerson+KNZDrink.m文件中實現(xiàn)這個方法
-
聲明
Snip20161008_25.png -
實現(xiàn)
Snip20161008_26.png
-
- 使用這個分類
- 在main.m文件中導入這個分類頭文件
Snip20161008_27.png
-
實例對象person調(diào)用分類中的方法回还,打印
Snip20161008_29.png 實現(xiàn)了KNZPerson這個類的方法擴展
創(chuàng)建一個KNZPerson的子類KNZSon裆泳,檢驗一下是否繼承了分類中的方法-(void)drink.
Snip20161008_30.png
- 在main.m文件中導入子類KNZSon類,并創(chuàng)建一個子類KNZSon實例對象son柠硕,調(diào)用父類KNZPerson的分類方法drink工禾。
<code>
#import <Foundation/Foundation.h>
#import "KNZPerson.h"
#import "KNZPerson+KNZDrink.h"
#import "KNZSon.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
KNZSon *son = [[KNZSon alloc]initWithName:@"son" age:5 sex:1];
[son drink];
}
return 0;
}
</code>
-運行,打印如下
Snip20161008_32.png
- drink方法被其子類KNZSon繼承了蝗柔。
2.類擴展
-
將KNZPerson.h文件中聲明的屬性放到類KNZPerson擴展中闻葵,實現(xiàn)屬性私有化。在@implementation上面添加類擴展癣丧,如下圖槽畔。
Snip20161008_34.png -
在類擴展中聲明的屬性,其它類不可再訪問坎缭,main.m文件中報錯
Snip20161008_35.png 類擴展常用于iOS開發(fā)中聲明屬性和連線獲取界面UI控件竟痰,實現(xiàn)封裝性。
3.協(xié)議
-
創(chuàng)建一個協(xié)議文件掏呼,并命名為KNZOther坏快。
Snip20161008_36.png
Snip20161008_37.png
- 在協(xié)議文件中聲明方法-(void)doWork和-(void)walk兩個方法
- 默認聲明的方法必須實現(xiàn),沒有實現(xiàn)的話會報錯憎夷;
- @optional聲明的方法可以不實現(xiàn)
Snip20161008_38.png
- 讓KNZPerson類遵守此協(xié)議
-
在KNZPerson.h文件中導入?yún)f(xié)議頭文件KNZOther.h莽鸿,讓KNZPerson類遵守協(xié)議KNZOther
-
-
編譯conmand+B,警告提示沒有實現(xiàn)-(void)doWork方法
Snip20161008_40.png - 在KNZPerson.m文件中實現(xiàn)doWork方法,不需要在KNZPerson.h中再次聲明協(xié)議中的方法拾给。
Snip20161008_3.png
- 在main.m文件中person對象調(diào)用doWork方法
<code>
//
// main.m
// 自定義類
//
// Created by 李陽 on 2016/10/7.
// Copyright ? 2016年 kenzo. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "KNZPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
KNZPerson *person = [[KNZPerson alloc]initWithName:@"kenzo" age:28 sex:1];
[person talk];
[person doWork];
}
return 0;
}
</code> - 運行祥得,打印如下
Snip20161008_4.png
- 只要你遵守了此協(xié)議中聲明的方法,那么就可以去實現(xiàn)蒋得,不關(guān)心類的類型级及;通常使用協(xié)議實現(xiàn)“代理”設(shè)計模式,只要成為對象的delegate代理對象额衙,代理對象就可以實現(xiàn)對象的代理方法饮焦,iOS開發(fā)中用得最多的就是代理模式去實現(xiàn)MVC。