博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC协议
阅读量:5907 次
发布时间:2019-06-19

本文共 3763 字,大约阅读时间需要 12 分钟。

协议:Protocol 它可以声明一些必须实现的方法和选择实现的方法
    作用:用来声明一些方法 由一系列的方法声明组成的
一个类可以遵守1个或多个协议
任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明
 
协议和继承的区别:
1.继承之后默认就有实现,而Protocol只有声明没有实现
2.相同类型的类可以使用继承,但是不同类型的类只能使用(Protocol)协议
3.Protocol可以用于存储方法的声明可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可
 
注意点:
1.协议只能声明方法,不能声明属性
{
     int _age;
}
2.父类遵守了某个协议,那么子类也会自动遵守这个协议
3.在OC中一个类可以遵守1个或多个协议
     注意:OC中的类只能有一个父类,也就是说OC中只有单继承
4.OC中的协议又可以遵守其它的协议,只要一个协议遵守了其它的协议,那么这个协议中就会自动包含其他协议的声明
 
 
基协议:
1.NSobject是一个基类,最根本最基本的类,任何其他类最终都要继承它
2.还有名字叫NSObject的协议,它是一个基协议,最根本最基本的协议
3.NSObject协议中声明很多最基本的方法
     description
     retain
     release
4.建议每个新的协议都要遵守NSObject协议
 
@required和@optional关键字
1.协议中的2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
     @required:这个方法必须要实现(若不实现,编译器会发出警告)
     @optional:这个方法不一定要实现
 
 
#import <Foundation/Foundation.h>
#import "Student.h"
#import "OtherStudent.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        OtherStudent *other = [[OtherStudent alloc] init];
   
        Student *stu = [[Student alloc] init];
        //判断是否遵循 lamcoProtocol 协议
        if ([stu conformsToProtocol:@protocol(lamcoProtocol)]) {
            //判断有没有 学习 的能力
            if ([stu respondsToSelector:@selector(study)]) {
                [stu study];
            }
            //判断有没有 帮助找到 工作 的能力
            if ([stu respondsToSelector:@selector(work)]) {
                [stu work];
            }
        }
        //判断是否遵循 BankProtocol 协议
        if ([stu conformsToProtocol:@protocol(BankProtocol)]) {
            //判断有没有 还款 的能力
            if ([stu respondsToSelector:@selector(giveme)]) {
                [stu giveme];
            }
        }
        if ([other conformsToProtocol:@protocol(lamcoProtocol)]) {
            if ([other respondsToSelector:@selector(work)]) {
                NSLog(@"可以参加培训");
            }
        } else {
            NSLog(@"不能参加培训");
        }
       
    }
    return 0;
}
#import <Foundation/Foundation.h>
#import "lamcoProtocol.h"
#import "BankProtocol.h"
@interface Student : NSObject <lamcoProtocol,BankProtocol>
@end
#import "Student.h"
@implementation Student
-(void)study
{
    NSLog(@"每天按时上课,复习,预习,做项目");
}
-(void)work
{
    NSLog(@"保证给你安排一个技术岗位");
}
-(void)giveme
{
    NSLog(@"每月按时还款");
}
@end
 
#import <Foundation/Foundation.h>
#import "lamcoProtocol.h"
#import "BankProtocol.h"
@interface OtherStudent : NSObject <lamcoProtocol>
@end
#import "OtherStudent.h"
@implementation OtherStudent
-(void)study
{
    NSLog(@"每天按时上课,复习,预习,做项目");
}
-(void)work
{
    NSLog(@"保证给你安排一个技术岗位");
}
-(void)giveme
{
    NSLog(@"每月按时还款");
}
@end
 
//BankProtocol 协议
#import <Foundation/Foundation.h>
@protocol BankProtocol <NSObject>
-(void)giveme;
@end
//lamcoProtocol 协议
#import <Foundation/Foundation.h>
@protocol lamcoProtocol <NSObject>
-(void)study;
-(void)work;
@end
 
 
协议的应用场景:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "WifeProtocol.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        Person *p = [[Person alloc] init];
        //1.协议的第一个应用场景,可以将协议写在数据类型的右边,明确的标注如果想给该量赋值,那么该对象必须遵守某个协议
//        Wife<WifeProtocol> *w = [[Wife alloc] init];
       
        Wife *w = [[Wife alloc] init];
        p.wife = w;
        [p show];
       
    }
    return 0;
}
 
#import <Foundation/Foundation.h>
#import "Wife.h"
@interface Person : NSObject
//注意:类型限定是写在数据类型的右边
@property(strong,nonatomic) Wife<WifeProtocol> *wife;
-(void)show;
@end
#import "Person.h"
@implementation Person
-(void)show
{
    //注意:虽然在接受某一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),但是并不意味着这个对象真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证
    if ([self.wife respondsToSelector:@selector(cooking)]) {
        [self.wife cooking];
    }
    if ([self.wife respondsToSelector:@selector(washing)]) {
        [self.wife washing];
    }
    if ([self.wife respondsToSelector:@selector(job)]) {
        [self.wife job];
    }
   
}
@end
 
#import <Foundation/Foundation.h>
#import "WifeProtocol.h"
@interface Wife : NSObject <WifeProtocol>
@end
#import "Wife.h"
@implementation Wife
-(void)cooking
{
    NSLog(@"%s",__func__);
}
-(void)washing
{
    NSLog(@"%s",__func__);
}
-(void)job
{
    NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>
@protocol WifeProtocol <NSObject>
//会做饭
-(void)cooking;
//会洗衣服
-(void)washing;
//有一份好工作
-(void)job;
@end
 

转载于:https://www.cnblogs.com/lichengjin/p/5236257.html

你可能感兴趣的文章
模板特化疑问
查看>>
赵海峰:站在电商平台上的互联网金融架构实践
查看>>
-webkit-animation- 实践
查看>>
滚动的标签
查看>>
XBImageFilters
查看>>
StackBox
查看>>
观察者模式
查看>>
The network connection was lost.
查看>>
android绑定Service失败原因
查看>>
android控件详解大全
查看>>
LINUX安装SVN+添加自动同步+远程下载最新代码
查看>>
使用jquery来获取table的行和列的值
查看>>
android 休眠与唤醒II
查看>>
swoole入门教程04-多端口监听、热重启以及Timer进阶:简单crontab
查看>>
HDFS + WEB 项目 报java.lang.VerifyError... 异常
查看>>
Nginx 配置示例
查看>>
关于php cron任务管理的实现假设
查看>>
第三章:DispatcherServlet详解
查看>>
mysql索引最左原则问题
查看>>
Python天天美味(总)
查看>>