標籤:objective-c ios delegate
- 一Category的定義和使用
- 二Extension的定義和使用
- 三Protocol的定義和使用
一、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檔案。就像一張任務清單,上?寫了一堆需要處理的事。清單交給誰,誰就要去完成清單上規定的任務。接受協議的對象實現協議中定義的方法。即:清單交給誰,誰就要去完成清單上規定的任務。
協議分兩種: 正式協議和非正式協議。
協議中的方法預設是必須實現的,即@required。關鍵字@optional修飾的?法是可選的,可實現也可以不實現。
協議和代理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(@"我和%@結婚了, %@負責掙錢了.", 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學習筆記_類的擴充