協議和代理,協議代理

來源:互聯網
上載者:User

協議和代理,協議代理

==========================

協議和代理

==========================

【協議】

@protocol

 

【協議的作用】:規定了需要實現的介面方法,在委託方和代理方都需要遵從的一個協議。

委託方通過(nt.delegate = self;)這種方式進行委託【注,不僅可以委託自己,也可以委託其他的類】

代理方通過([_delegate test];)這種方式進行方法的代理(替...幹了....)

 

【例如】:

小明是委託方,小剛是代理方。他們之間都遵從一個協議。協議中規定了2個方法(功能);小明把自己委託給了小剛,小剛則擁有了指向小明的對象的指標,通過這個指標可以訪問小明的任何方法(必須是協議中規定的方法)

【注】協議中的方法有如下2中許可權

1.@required//委託方(小明)必須實現這個方法

2.@optional//委託方(小明)可以實現,也可以不實現這個方法

 

【注】@required要求的方法如果不實現,則會提示警告,@optional如果不實現,則沒有任何問題。

【注】使用哪個協議,必須包含協議的標頭檔。

 

【代理和協議的添加方式】

1.包含標頭檔

2.在委託方添加協議,然後實現協議方法

3.在代理方實現代理物件變數。

4.在委託方,給代理物件變數賦值

5.在需要用到的地方,通過代理對象的變數,去訪問委託的方法

 

#import <Foundation/Foundation.h>

#import "xiaoming.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        xiaoming* xm = [[xiaoming alloc]init];      

        // 測試用的

        [xm method];

    }

    return 0;

}

 

#import <Foundation/Foundation.h>

#import "print.h"

#import "xiaoming.h"

#import "xiaogang.h"

@implementation xiaoming

// 在method這個方法裡面練習委託和代理的用法

- (void)method

{

    xiaogang* xg = [[xiaogang alloc]init];

    // 把自己委託給了小剛,這是一個賦值的過程

    xg.woshidaili = self; 

    // 測試代理程式是否好用

    [xg test];

}

- (void)OutPutPersonInfo

{

    NSLog(@"我是委託方,我委託小剛去幹一件事情");

}

@end

 

#import <Foundation/Foundation.h>

#import "print.h"

@interface xiaoming : NSObject<print>

- (void)method;

@end

 

#import <Foundation/Foundation.h>

#import "print.h"

@interface xiaogang : NSObject

// woshidaili 是一個自訂類型 ,類型是:id<print>

// 可以理解為:是id類型,只是這個id類型遵從了協議

// 【注】id後的角括弧肯定是跟著協議的名稱

@property id<print> woshidaili;

// 用來測試代理程式是否好用

- (void)test;

@end

 

#import "xiaogang.h"

@implementation xiaogang

- (void)test

{

    // 通過代理對象的變數 去訪問委託方的方法

    [_woshidaili OutPutPersonInfo];

}

@end

 

#import <Foundation/Foundation.h>

@protocol print <NSObject> 

// 列印個人資訊

- (void)OutPutPersonInfo;

@end

【協議和代理用處】

例如商品頁的商品購買,但是使用者沒登陸,需要先登陸,登陸成功後,需要把狀態告訴商品頁,商品頁判斷登陸狀態,然後繼續進行下一步操作。【注】登陸頁就是在商品頁中建立出來的一個對象;【代理的回調】

【協議和代理局限性】

只能是2個相關聯的類之間進行資料的互相訪問。

【例如】小明委託小剛乾什麼;小剛委託小紅幹什麼

【respondsToSelector方法】

作用:使代碼更安全,防止崩潰

    // 判斷OutPutPersonInfo 方法是否存在,存在跳入方法

    if([_woshidaili respondsToSelector: @selector(OutPutPersonInfo:)])

    {

        [_woshidaili OutPutPersonInfo: @"我是小剛"];

    }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.