IOS開發protocol使用

1.什麼是protocol?objective-c

protocol(協議)是用來定義對象的屬性和行爲,用於回調。ui

2.protocol分類?
spa

協議中有三個修飾關鍵字@required和@optional和@property。code

3.三個修飾關鍵字的做用
對象

被@required修飾的方法爲必須實現的方法;it

被@optional修飾的方法爲可選實現的方法;io

@property用於修飾屬性。
編譯


1、定義一個protocolclass

新建文件的時候不要選擇objective-c Class;而要選擇objective-c protocol。
import

#import <Foundation/Foundation.h>

@protocol ClassADelegate <NSObject>
@required//必須實現
- (void)methodA;
@optional//可選實現
- (void)methodB;
@property
NSString *_str;
@end

2、定義protocol的實現(只是定義,對外宣稱本身實現了

A.建立一個objective-c Class,在頭文件中實現 ClassADelegate。

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

@interface ClassA : NSObject <ClassADelegate>

@end

3.調用protocol中的方法(相似Java中調用interface中的方法)

#import "ViewController.h"
#import "ClassA.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    ClassA *a = [[ClassA alloc] init];
    [a methodA];
    [a methodB];
}
4.運行程序,發現報錯

ProtocolAndDelegate[373:60b] -[ClassA methodA]: unrecognized selector sent to instance 0x17001dff0
緣由分析:在第二步裏面,只是定義了實現,爲真正實現。

在ClassA.m文件的頂部會有警告提示:

	Method 'methodA' in protocol not implemented

methodB被@optional修飾,是可選實現,全部沒有警告提示;可是運行的時候依然會報錯。

5.真正實現協議中的方法

#import "ClassA.h"


@implementation ClassA 

- (void)methodA{
    NSLog(@"ClassA methodA exec");
}

- (void)methodB{
    NSLog(@"ClassA methodB exec");
}

@end

6.再次運行程序

2014-09-25 14:27:17.751 ProtocolAndDelegate[380:60b] ClassA methodA exec
2014-09-25 14:27:17.752 ProtocolAndDelegate[380:60b] ClassA methodB exec

7.respondsToSelector容錯處理

協議中的方法若是沒有被真正實現,程序是能夠編譯經過的,可是在運行的時候會出錯。特別的是可選實現的方法,未被真正實現的可能性極高,直接調用protocol方法出錯的可能性極高。

規定:「出席今天的宴會,能夠打領帶,也能夠不打領帶」

紳士打了領帶;屌絲爲打領帶。

此時若是直接去全部赴宴者領帶上的花紋,就會出現異常。先判斷下這個赴宴者有沒有打領帶,若是有再獲取領帶上的花紋。

處理辦法以下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    ClassA *a = [[ClassA alloc] init];
    if ([a respondsToSelector:@selector(methodA)]) {
        [a methodA];
    }
    if ([a respondsToSelector:@selector(methodB)]) {
        [a methodB];
    }
}
相關文章
相關標籤/搜索