1. 程式人生 > >Objective-C_類的擴展

Objective-C_類的擴展

optional required ons 可選 步驟 代理 number ace roc

  • 一Category的定義和使用
  • 二Extension的定義和使用
  • 三Protocol的定義和使用
    • delegate的使用

一、Category的定義和使用

Category,分類或類目。主要作用是為沒有源碼的類加入方法。通過Category加入的方法會成為原類的一部分。

從而達到擴展一個類的功能。

定義Category過程

  1. 新建?件
  2. 選擇Objective-C Category模板
  3. 填寫類名和分類名
  4. .h?件加入?法聲明
  5. .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個步驟

  1. 聲明協議
  2. 設置代理人屬性
  3. 讓代理人調用方法(通知代理人運行方法)
  4. 簽訂協議
  5. 指定代理人
  6. 實現協議方法

以結婚為樣例(女方和男方)

  1. 聲明協議 (女方)
  2. 設置代理人屬性 (女方)
  3. 讓代理人調用方法(通知代理人運行方法) (女方)
  4. 簽訂協議 (男方)
  5. 指定代理人 (女方)
  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_類的擴展