protocol(协议),用来声明方法,因为只做声明不做实现,所以只有一个【.h】文件
XCode7中的创建位置如下
//
// MyProtocol.h
// Block
//
// Created by LiuMingchuan on 15/10/1.
// Copyright © 2015年 LMC. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
- (void)test001;
@required
- (NSString *)test002;
@optional
- (void)test003:(NSString *)name;
@end
上面就是我们创建的一个简单的protocol
@required是说明这个方法在使用这个协议的类中必须实现(不会有错,但是有警告)
@optional是说明这个方法在使用这个协议的类中可以实现也可以不实现
test001没有则是默认是必须要实现的(不实现会有警告没有错误)
我们值得注意的是MyProtocol是有基协议的(NSObject)
@protocol NSObject
- (BOOL)isEqual:(id)object;
@property (readonly) NSUInteger hash;
@property (readonly) Class superclass;
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead");
- (instancetype)self;
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
- (BOOL)isProxy;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;
@end
因此当我们做成基协议的时候也一定要遵从NSObject基协议
我们看一下协议的遵守
//
// LMC.h
// OCStudy
//
// Created by LiuMingchuan on 15/9/27.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "Person.h"
#import "MyProtocol.h"
@interface LMC : Person <MyProtocol>
@property (nonatomic,assign)int age;
@end
在我们想要使用协议的头文件中使用【<>】添加协议,我们一个类可以遵从多个协议【<protocol1,protocol2......>】
在我们在【.m】文件中没有做任何实现时,会有警告,因为MyProtocol的test001和test002是必须实现的
协议的实现如下:
//
// LMC.m
// OCStudy
//
// Created by LiuMingchuan on 15/9/27.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "LMC.h"
@implementation LMC
-(void)test001{
}
-(NSString *)test002{
return @"";
}
-(void)test003:(NSString *)name{
}
@end
如果我们的一个协议中包含另一个协议中的协议定义,那么我们可以使用协议遵循协议的方法来实现这个协议
MyProtocol01<MyBaseProtocol>
小结:
我们上面说了
1》protocol的在Xcode中的创建
2》协议的声明,必选(required),可选(optional)关键字的使用
3》基协议(NSObject)
4》多协议的遵从以及协议遵从协议
5》遵从协议而不实现协议中的方法,不会影响编译,只会警告