Objective-C_類的擴展
- 一Category的定義和使用
- 二Extension的定義和使用
- 三Protocol的定義和使用
- delegate的使用
一、Category的定義和使用
Category,分類或類目。主要作用是為沒有源碼的類加入方法。通過Category加入的方法會成為原類的一部分。
從而達到擴展一個類的功能。
定義Category過程
- 新建?件
- 選擇Objective-C Category模板
- 填寫類名和分類名
- .h?件加入?法聲明
- .m加入?法實現
Category的聲明
NSString+SayHi.h文件
@interface NSString (SayHi)
- (void)hi;
@end
Category的實現
NSString+SayHi.m文件
#import “NSString+SayHi.h”
@implementation NSString(SayHi)
- (void)hi
{
NSLog(@”這是通過category為NSString加入的hi?方法”)。
}
@end
Category與?類的差別
Category(類目) | Subclass(子類) | |
---|---|---|
功能 | 僅僅能為類加入方法 | 既能為類加入方法。也能加入變量 |
特點 | 新加入的方法會變成原始類的一部分,能被子類繼承 | 新加入的方法僅僅有子類才有。父類沒有 |
使用 | 使用原始類的實例(-號方法)或者使用原始類(+號方法)調用方法 | 子類才幹調用, |
二、Extension的定義和使用
Extension,延展。主要作用是管理類的“私有”方法。面向對象編程在設計一個類的時候,有些方法須要對外公開(我們稱為接口)。有些方法僅僅內部使用。
Extension的功能是幫我們去管理這些內部使用的方法(“私有”方法)。
定義Extension過程
Extension的語法格式和Category非常類似,相當於把Category的.h文件放到了原始類的.m文件裏。Extension針對的是本類。必須有源碼的類。
xxx.m文件
@interface xxx (ExtensionName)
//你的方法列表
@end
@implementation xxx
//方法的實現
@end
Category和Extension的差別
Category | Extension | |
---|---|---|
作用 | 為沒有源碼的類加入方法 | 管理類的私有方法 |
格式 | 定義一對.h和.m | 把代碼寫到原始類的.m文件裏 |
三、Protocol的定義和使用
Protocol。協議。是iOS開發中經常使用的技術。協議是一套標準(一堆方法的聲明),僅僅有.h文件。
就像一張任務清單,上?寫了一堆須要處理的事。清單交給誰,誰就要去完畢清單上規定的任務。接受協議的對象實現協議中定義的方法。
即:清單交給誰。誰就要去完畢清單上規定的任務。
協議分兩種: 正式協議和非正式協議。
協議中的方法默認是必須實現的,[email protected]
[email protected]?法是可選的,可實現也能夠不實現。
協議和代理6個步驟
- 聲明協議
- 設置代理人屬性
- 讓代理人調用方法(通知代理人運行方法)
- 簽訂協議
- 指定代理人
- 實現協議方法
以結婚為樣例(女方和男方)
- 聲明協議 (女方)
- 設置代理人屬性 (女方)
- 讓代理人調用方法(通知代理人運行方法) (女方)
- 簽訂協議 (男方)
- 指定代理人 (女方)
- 實現協議方法 (男方)
結婚演示樣例的代碼實現:
Girl.h文件代碼例如以下:
#import <Foundation/Foundation.h>
#pragma mark 協議第一步
/* 聲明協議 */
@protocol Marry <NSObject>
/* 方法分兩種 */
@required /* 必需的 */
- (void)makeMoney;
@optional /* 可選的 */
- (void)washCloth;
- (void)cook;
@end
@interface Girl : NSObject
#pragma mark 協議第二步
/* 設置代理人屬性, 註意:assign */
@property (nonatomic, assign) id<Marry> delegate;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;
#pragma mark 協議第三步
/* 通知代理人調用方法 */
- (void)marry;
@end
Girl.m文件代碼例如以下:
#import "Girl.h"
@implementation Girl
#pragma mark 協議第三步
/* 通知代理人調用方法 */
- (void)marry
{
NSLog(@"[email protected], [email protected]", self.delegate, self.delegate);
[self.delegate makeMoney];
}
@end
Boy.h文件代碼例如以下:
#import <Foundation/Foundation.h>
#import "Girl.h" /* 僅僅能是import */
#pragma mark 協議第四步
/* 簽訂協議 */
@interface Boy : NSObject<Marry>
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
Boy.m文件代碼例如以下:
#import "Boy.h"
@implementation Boy
#pragma mark 協議第六步
/* 實現協議方法 */
- (void)makeMoney
{
NSLog(@"我是%@, 我負責掙錢.", self.name);
}
@end
main.m文件代碼例如以下:
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
/* 創建Girl 和 Boy對象 */
Girl *girl = [[Girl alloc] init];
girl.name = @"LiSi";
girl.age = 22;
Boy *boy = [[Boy alloc] init];
boy.name = @"WangLaowu";
boy.age = 25;
#pragma mark 協議第五步
/* 指定代理人 */
girl.delegate = boy;
[girl marry];
}
return 0;
}
delegate的使用
Protocol的核?使用場景是實現delegate設計模式。delegate(代理)。通俗的講就是代理商。基本的任務是幫你完
成一些任務。比方:保姆就能夠覺得是delegate,基本的任務是幫你帶孩子、做飯、洗衣服等。
使?場景:凡是某些任務?己不去實現,想讓別人去實現的時候。就能夠指定一個代理。讓代理幫你去做。
你僅僅須要通知代理去做某事。
Objective-C_類的擴展