黑马程序员_iOS_OC_协议

原创 2015年11月19日 14:18:29

 ——- android培训java培训、期待与您交流! ———-

1.protocol概念

protocol可以声明一些必须实现的方法和选择实现的办法。
定义协议——>采纳协议——>实现协议

/*
 什么是协议?
    一些方法的声明,一般写到一个.h的头文件中
 方法有两种:
    1)必须实现
    2)选择实现
 协议的作用:
    供其他类去遵守,
    如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法。
 如何定义一个协议:
    @protocol xxx<NSObject> 默认情况下遵守NSObject
    @end
 类遵守协议的格式:
    1)遵守协议:
    先导入头文件
    @interface 类名:NSObject<xxx,aaa,...>
    @end

 */

2.protocol基本使用

#import <Foundation/Foundation.h>
@protocol workProtocol <NSObject>
-(void) work;
@end
#import <Foundation/Foundation.h>
//定义一个协议
@protocol baseProtocol <NSObject>
//声明一些方法
-(void) eat;
-(void) run;
@end
#import <Foundation/Foundation.h>
//导入协议头文件
#import "baseProtocol.h"
#import "workProtocol.h"
//遵守协议
@interface Person : NSObject <baseProtocol,workProtocol>//遵守多个协议
@end
#import "Person.h"
@implementation Person
//实现协议
-(void) eat
{
    NSLog(@"%s",__func__);
}
-(void) run
{
    NSLog(@"%s",__func__);
}
-(void) work
{
    NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"//导入头文件
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [Person new];
        //调用协议方法
        [person eat];
        [person run];
        [person work];

    }
    return 0;
}

3.protocol其他用法

OC中协议使用注意:
1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2)只要某个类遵守了这个协议,就拥有了这个协议中所有的方法声明。
3)只要父类遵守了某个协议,那么子类也遵守。
4)Protocol声明的方法可以让任何类去实现,protocol就是协议。
5)OC不能继承多个类,但能遵守多个协议。
6)是基协议,是最根本的协议,其中声明了很多基本方法。
7)协议可以遵守协议,并拥有另一个协议的方法声明。

#import <Foundation/Foundation.h>
@protocol run <NSObject>
-(void) run;
@end
#import <Foundation/Foundation.h>
//导入协议头文件
#import "run.h"
//遵守协议
@interface Person : NSObject <run>//遵守协议
@end
#import "Person.h"
@implementation Person
//实现协议
-(void) run
{
    NSLog(@"%s",__func__);
}
@end
#import "Person.h"
@interface Student : Person
@end
#import "Student.h"
@implementation Student
-(void) run
{
    NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"//导入头文件
#import "Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
        [p run];//父类调用协议方法
        //父类遵守协议,子类也遵守协议
        Student *s = [Student new];
        [s run];//子类调用协议方法
    }
    return 0;
}

4.protocol类型限制

#import <Foundation/Foundation.h>
//导入类头文件
#import "Girl.h"
#import "Dog.h"
//导入协议头文件
#import "houseHold.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Girl *mm = [Girl new];
        Dog *dog = [Dog new];
        //第一种类型限制:给id类型增加限制
        //增加类型限制
        //<houseHold> 表示只能赋值遵守了houseHold协议的对象
        id<houseHold> obj = mm;
        //第二种类型限制
        //表示obj2赋值时,只能是Girl对象,且遵守协议
        Girl<houseHold> *obj2 = mm;
        //第三种类型限制
        obj2.dog = dog;
    }
    return 0;
}
#import <Foundation/Foundation.h>
@protocol houseHold <NSObject>
@required//必须实现的方法
-(void) ZuoFan;
-(void) XiYiFu;
@optional//可选实现的方法
-(void) GoodJob;
@end
#import <Foundation/Foundation.h>
#import "houseHold.h"//导入协议头文件
#import "Dog.h"
@interface Girl : NSObject <houseHold>
@property (nonatomic,strong) Dog<houseHold> *dog;//添加关联限制
@end
#import "Girl.h"
@implementation Girl
-(void) ZuoFan
{
    NSLog(@"%s",__func__);
}
-(void) XiYiFu
{
    NSLog(@"%s",__func__);
}
//可选择实现的方法
-(void) GoodJob
{
    NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>
#import "houseHold.h"
@interface Dog : NSObject <houseHold>
@end
#import "Dog.h"
@implementation Dog
-(void) ZuoFan
{
    NSLog(@"%s",__func__);
}
-(void) XiYiFu
{
    NSLog(@"%s",__func__);
}
@end

id和instancetype的区别:
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数返回值、参数类型,也能用来定义变量。
3)instancetype对比id的好处:
能精确的限制返回值的具体类型。

5.protocol中@required和@optional

@required:这个方法必须要实现
@optional:必须要实现

#import <Foundation/Foundation.h>
//导入类头文件
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
        [p eat];
        [p run];
    }
    return 0;
}
#import <Foundation/Foundation.h>
@protocol baseProtocol <NSObject>
//@required和@optional都是协议中的类
@required//修饰方法:必须实现
-(void) run;
-(void) eat;
@optional//修饰方法:选择实现
-(void) fight;
@end
#import <Foundation/Foundation.h>
#import "baseProtocol.h"
@interface Person : NSObject <baseProtocol>
@end
#import "Person.h"
@implementation Person
//实现必须实现的方法
-(void) run{
    NSLog(@"%s",__func__);
}
-(void) eat{
    NSLog(@"%s",__func__);
}
@end

6.protocol代理设计模式引入

由一个满足协议的类作为代理,这个类为实现另一个类的某些方法没有的方法。

#import <Foundation/Foundation.h>
//导入类头文件
#import "Baby.h"
#import "Baomu.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Baby *baby = [Baby new];
        baby.bm = [Baomu new];//给 baby设置一个代理人  保姆
        [baby wantEat];
        [baby wantSleep];
    }
    return 0;
}
#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"//关联限制导入协议头文件
@class Baomu;
@interface Baby : NSObject
@property (nonatomic,strong) Baomu<lookBabyProtocol> *bm;
-(void) wantEat;
-(void) wantSleep;
@end
#import "Baby.h"
#import "Baomu.h"
@implementation Baby
-(void) wantEat
{
    NSLog(@"%s",__func__);
    [self.bm feedBaby];
}
-(void) wantSleep
{
    NSLog(@"%s",__func__);
    [self.bm hongBaby];
}
@end
#import <Foundation/Foundation.h>

@protocol lookBabyProtocol <NSObject>
-(void) feedBaby;
-(void) hongBaby;

@end
#import <Foundation/Foundation.h>
//保姆要想成为baby的代理人,必须遵守协议
#import "lookBabyProtocol.h"
@interface Baomu : NSObject <lookBabyProtocol>

@end
#import "Baomu.h"

@implementation Baomu
-(void) feedBaby
{
    NSLog(@"%s",__func__);
}
-(void) hongBaby
{
    NSLog(@"%s",__func__);
}
@end

7.protocol代理设计模式

代理模式概念:
传入的对象,代理当前类完成某个功能,称为代理模式。

黑马程序员IOS-OC语言-分类、协议

OC 分类 协议

黑马程序员_iOS开发之OC之block块与@protocol协议

一、block的使用 1> 如何定义block变量  int (^sumblock)(int, int);  //--------------------------   ...

——黑马程序员——OC中正式协议protocol的用法总结

-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------

黑马程序员——oc加强学习(协议)

------- android培训、java培训、期待与您交流! ----------  什么是协议?          一些方法的声明,一般写到一个.h的头文件中         方法有...

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用。 在看...

黑马程序员_OC中的协议学习

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 在说到正式协议之前,还有一种叫做...
  • conpgy
  • conpgy
  • 2014年03月31日 16:45
  • 462

黑马程序员——OC基础---协议

------- android培训、java培训、期待与您交流! ----------      1 -  协议的概念          一些方法的声明(注意:只是声明,没有实现!!同时也没...

黑马程序员 --- OC中的协议代理

OC中的协议代理 protocol 代理设计模式概念 代理模式概念:传入的对象,代替当前类完成了某个功能,称为代理模式。 代理模式的引用:       代理模式是在oc中经常遇到的一种设计模...

黑马程序员 oc随记 协议与代理模式

------- android培训、java培训、ios培训、期待与您交流! ---------- 一.协议(protocol) 协议的定义 @protocol 协议名称 ...
  • cpo007
  • cpo007
  • 2015年08月11日 22:09
  • 164

黑马程序员-----oc语言学习笔记之block和协议

------Java培训、Android培训、iOS培训、.Net培训>、期待与您交流! -------   oc语言block和协议 一、block 1、block基本概念 block是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_iOS_OC_协议
举报原因:
原因补充:

(最多只允许输入30个字)