protocol小解(一)

本文介绍了Objective-C中的Protocol,包括其声明、@required和@optional的区别、基协议(通常为NSObject)、多协议遵从以及未实现协议方法时的警告情况。通过示例详细解析了协议的创建和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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》遵从协议而不实现协议中的方法,不会影响编译,只会警告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值