IOS开发protocol使用

1.什么是protocol?

protocol(协议)是用来定义对象的属性和行为,用于回调。

2.protocol分类?

协议中有三个修饰关键字@required和@optional和@property。

3.三个修饰关键字的作用

被@required修饰的方法为必须实现的方法;

被@optional修饰的方法为可选实现的方法;

@property用于修饰属性。


一、定义一个protocol

新建文件的时候不要选择objective-c Class;而要选择objective-c protocol。

#import <Foundation/Foundation.h>

@protocol ClassADelegate <NSObject>
@required//必须实现
- (void)methodA;
@optional//可选实现
- (void)methodB;
@property
NSString *_str;
@end

二、定义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];
    }
}


posted @ 2014-09-25 14:07  哈特中尉  阅读(745)  评论(0编辑  收藏  举报