天天看點

Objective-C的委托(Delegate)0x01 什麼是委托0x02 委托和類别0x03 委托示例0x04 總結

0x01 什麼是委托

Cocoa中的類經常使用一種名為委托(delegate)的技術。

委托是一種對象,另一個類的對象會要求委托對象執行它的某些操作。

0x02 委托和類别

委托+類别的一種應用:建立一個非正式協定。

通過建立非正式協定,将一些方法聲明為NSObject的類别,方法的實作可以發送給任何對象,無論這些對象實際上屬于哪一個類。

這也意味着,隻要一個類添加了這個NSObject類别的頭檔案,這個對象就成為了一個委托對象,可以調用類别中聲明的方法。

0x03 委托示例

首先,我們要建立一個以NSObject為根類的類别:

Objective-C的委托(Delegate)0x01 什麼是委托0x02 委托和類别0x03 委托示例0x04 總結

Xcode自動生成類别的.h和.m檔案:

Objective-C的委托(Delegate)0x01 什麼是委托0x02 委托和類别0x03 委托示例0x04 總結

然後,在類别的接口中,聲明了示例方法example_method:

//NSObject+Delegate.h
#import <Foundation/Foundation.h>

@interface NSObject (Delegate)

-(NSString *) example_method;

@end
           

類别的實作中,把example_method:方法實作:

//NSObject+Delegate.m
#import "NSObject+Delegate.h"

@implementation NSObject (Delegate)

-(NSString *) example_method{
    NSLog(@"I am B.");
    NSLog(@"And A tell me:");

    NSString *string = @"Delegate+Category called Informal Protocol.";
    return string;
}

@end
           

接着,我們要建立一個新的類Test,這個Test類将委托類别Delegate幫自身完成工作。

Test類的接口如下:

#import <Foundation/Foundation.h>

@interface Test : NSObject

-(NSString *) test_method;

@end
           

Test類的實作如下:

#import "Test.h"
#import "NSObject+Delegate.h"

@implementation Test

NSString *test_str;

-(NSString *) test_method{
    NSLog(@"I am A, and I order B to do something.");

    //調用NSObject類别中的方法
    NSString *str = [NSString stringWithFormat:@"%@",[self example_method]];  
    return str;
}

@end
           

最後,寫一個main函數輸出委托示例:

#import <Foundation/Foundation.h>
#import "Test.h"


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

        Test *test = [[Test alloc] init];    //記得給Test類配置設定空間并初始化
        
        //委托示例
        //Test類通過調用自身的test_method:方法,去調用NSObject類别中的方法
        NSLog(@"%@",test.test_method);       

        NSLog(@"%s","Delegate Completed.");
    }
    return 0;
}

//Output:
//Delegate_Test[2870:53058] I am A, and I order B to do something.
//Delegate_Test[2870:53058] I am B.
//Delegate_Test[2870:53058] And A tell me:
//Delegate_Test[2870:53058] Delegate+Category called Informal Protocol.
//Delegate_Test[2870:53058] Delegate Completed.
//Program ended with exit code: 0
           

0x04 總結

要實作委托效果,在Objective-C中最要的是,類必須遵循某個正式或非正式的協定,然後把自己的self指針指派給委托。