簡介
- 協(xié)議
- 在協(xié)議中聲明方法和屬性,在遵守此協(xié)議的類中實(shí)現(xiàn)協(xié)議中聲明的方法。在iOS開發(fā)中常用于代理設(shè)計(jì)模式,實(shí)現(xiàn)MVC。
- 分類
- 分類不需要?jiǎng)?chuàng)建其子類繼承擴(kuò)展類的方法。分類中的方法會(huì)成為類的組成部分,并且會(huì)被其子類繼承。常用于增加類的功能或按功能劃分幾個(gè)分類文件,模塊化設(shè)計(jì)類,使得類不顯得那么臃腫。
- 理論上分類不可以聲明成員變量,但因?yàn)镺bjective-C擁有動(dòng)態(tài)特性的,使用runtime為分類聲明一個(gè)成員變量。
- 類擴(kuò)展
- 被視為一種匿名分類,被聲明的方法必須在對應(yīng)的類的@implementation中實(shí)現(xiàn),一般在.m文件中實(shí)現(xiàn)。
- 可以在類擴(kuò)展中聲明成員變量、成員屬性、成員方法,并且都是私有的,子類不可以繼承。
- 在iOS開發(fā)中,常用于屬性聲明及@outlet連線獲取界面UI控件,不被外界訪問。
1.分類
- 為KNZPerson類添加一個(gè)分類KNZDrink,擴(kuò)展它的方法
Snip20161008_23.png
- 生成KNZPerson+KNZDrink.h和KNZPerson+KNZDrink.m文件
Snip20161008_24.png
- 在KNZPerson+KNZDrink.h中聲明一個(gè)方法-(void)drink,在KNZPerson+KNZDrink.m文件中實(shí)現(xiàn)這個(gè)方法
-
聲明
Snip20161008_25.png -
實(shí)現(xiàn)
Snip20161008_26.png
-
- 使用這個(gè)分類
- 在main.m文件中導(dǎo)入這個(gè)分類頭文件
Snip20161008_27.png
-
實(shí)例對象person調(diào)用分類中的方法,打印
Snip20161008_29.png 實(shí)現(xiàn)了KNZPerson這個(gè)類的方法擴(kuò)展
創(chuàng)建一個(gè)KNZPerson的子類KNZSon,檢驗(yàn)一下是否繼承了分類中的方法-(void)drink.
Snip20161008_30.png
- 在main.m文件中導(dǎo)入子類KNZSon類,并創(chuàng)建一個(gè)子類KNZSon實(shí)例對象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>
-運(yùn)行,打印如下
Snip20161008_32.png
- drink方法被其子類KNZSon繼承了。
2.類擴(kuò)展
-
將KNZPerson.h文件中聲明的屬性放到類KNZPerson擴(kuò)展中,實(shí)現(xiàn)屬性私有化。在@implementation上面添加類擴(kuò)展,如下圖。
Snip20161008_34.png -
在類擴(kuò)展中聲明的屬性,其它類不可再訪問,main.m文件中報(bào)錯(cuò)
Snip20161008_35.png 類擴(kuò)展常用于iOS開發(fā)中聲明屬性和連線獲取界面UI控件,實(shí)現(xiàn)封裝性。
3.協(xié)議
-
創(chuàng)建一個(gè)協(xié)議文件,并命名為KNZOther。
Snip20161008_36.png
Snip20161008_37.png
- 在協(xié)議文件中聲明方法-(void)doWork和-(void)walk兩個(gè)方法
- 默認(rèn)聲明的方法必須實(shí)現(xiàn),沒有實(shí)現(xiàn)的話會(huì)報(bào)錯(cuò);
- @optional聲明的方法可以不實(shí)現(xiàn)
Snip20161008_38.png
- 讓KNZPerson類遵守此協(xié)議
-
在KNZPerson.h文件中導(dǎo)入?yún)f(xié)議頭文件KNZOther.h,讓KNZPerson類遵守協(xié)議KNZOther
-
-
編譯conmand+B,警告提示沒有實(shí)現(xiàn)-(void)doWork方法
Snip20161008_40.png - 在KNZPerson.m文件中實(shí)現(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> - 運(yùn)行,打印如下
Snip20161008_4.png
- 只要你遵守了此協(xié)議中聲明的方法,那么就可以去實(shí)現(xiàn),不關(guān)心類的類型;通常使用協(xié)議實(shí)現(xiàn)“代理”設(shè)計(jì)模式,只要成為對象的delegate代理對象,代理對象就可以實(shí)現(xiàn)對象的代理方法,iOS開發(fā)中用得最多的就是代理模式去實(shí)現(xiàn)MVC。