• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Objective - C 之协议

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、创建方法:

二、实现过程:

     1、遵循协议:

          @protocol NurseWorkingProtocol <NSObject>   //<> 表示遵守协议,创建时就有(NurseWorkingProtocol.h中)

     2、协议内容:(NurseWorkingProtocol.h中)

         @required  // 必须做的,默认

         - (void)cleanHouse;

         @optional  // 可选的

         - (void)cook;

      3、指定遵循协议的人:(Nurse.h中)

           @interface Nurse : NSObject <NurseWorkingProtocol>   // 遵守协议

      4、完成协议指定的内容:(Nurse.m中实现)

           - (void)cleanHouse {

              NSLog(@"打扫房间!");

          }

          - (void)cook {

              NSLog(@"做饭");

          }

三、代理委托:(用Custom找Business买iPhone举例)

     1、创建协议:(Custom.h中)

@protocol CustomDelegate <NSObject>

- (void)buyIphone:(NSString *)iphoneType;

@end

     2、设置代理人:

@property (nonatomic,weak) id<CustomDelegate> delegate;  // 必须遵守协议

     3. 找代理人,见Business.h中遵守协议,并在Business.m中实现协议中的方法

@interface Business : NSObject <CustomDelegate>
- (void)buyIphone:(NSString *)iphoneType {
    
    NSLog(@"%@有货,我帮你买手机", iphoneType);
}

     4、上述一切准备就绪,就可以开始买手机啦:(Custom.h中声明方法,在Custom.m中实现如下)

 
- (void)beginBuy {
    
    //   找到代理人                代理人实现了代理方法,响应方法
    if (self.delegate && [self.delegate respondsToSelector:@selector(buyIphone:)]) {
        [self.delegate buyIphone:@"iphone7"];
        
    }else {
        NSLog(@"代理人不存在或者代理人没有实现代理方法");
    }
}

     5、在main函数中分别定义一个Custom和Business对象,将Custom对象的代理给business,即找到代理人,然后开始:

           custom.delegate = business;  // 找到代理人

           [custom beginBuy];           // 开始买

四、通知

     1、发布通知:(main.m)

 // 1. custom 发布通知              通知的关键标志 name 用于标识后面接收该通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"buyIphone" object:@"iphone7"];

     2、添加观察:(Business.m)

- (instancetype)init {
    
    self = [super init];

    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification:) name:@"buyIphone" object:nil];
    }
    return self;
}
- (void)notification :(id)noti { id obj = [noti valueForKey:@"object"]; // ValueForkey 因为是kvc的 NSLog(@"noti = %@", noti); NSLog(@"object = %@", obj); } - (void)dealloc { // [[NSNotificationCenter defaultCenter]removeObserver:self]; // 移除所有通知 [[NSNotificationCenter defaultCenter]removeObserver:self name:@"buyIphone" object:nil]; // 移除单条通知 因为是在ARC状态下,所以没有[super dealloc] }

五、总结:

         1. 协议只有声明文件

         2. 在遵守协议的类中导入协议的文件,并添加遵守协议  在@interface 后面加尖括号遵守协议

         3. @required 必须在.m 中实现, @option 可以不用实现,也即遵守协议做事情

         4. 原本类(Nurse.h)中 写@interface Nurse : NSObject <NurseWorkingProtocol>

         

         委托代理

         5. 可以单独写一个文件,如上所述,还可以在类中直接写 @protocal 见“代理委托”

         6. 对象类型后面加了<协议名>, 则该对象一定得是遵守了这个协议的对象

         7. 设置代理人的时候,要用弱引用(weak),而且要遵守过协议的对象才能成为代理人

         8. 委托代理使用了回调机制

         

         通知

         1. 注册接收通知的观察着

         2. 发送通知(postNotification)   ---   接收通知(addObserve)

         3. 移除通知 (dealloc 中 remove)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap