Objective-C學習筆記_類的擴充

來源:互聯網
上載者:User

標籤:objective-c   ios   delegate   

  • 一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檔案。就像一張任務清單,上?寫了一堆需要處理的事。清單交給誰,誰就要去完成清單上規定的任務。接受協議的對象實現協議中定義的方法。即:清單交給誰,誰就要去完成清單上規定的任務。

協議分兩種: 正式協議和非正式協議。

協議中的方法預設是必須實現的,即@required。關鍵字@optional修飾的?法是可選的,可實現也可以不實現。

協議和代理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(@"我和%@結婚了, %@負責掙錢了.", 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學習筆記_類的擴充

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.