zoukankan      html  css  js  c++  java
  • OC Protocol 协议

    一、概述

    • 协议就是委托(delegate)/代理,是指一个对象提供机会对另一个对象的变化做出反应或者影响另一个对象的行为。
    • 协议只能一个用途,就是为继承的类,声明出一堆方法的声明。
    • 基类遵守的协议,其派生类也要遵守其基类遵守的协议,也就是说父类的协议可以被子类继承。
    • 在OC中类不能多重继承,只能单继承,而协议却可以多继承。
    • 协议声明的方法可以由继承的任意类去实现。
    • 协议 <NSObject> 是一切协议的基协议。
    • 协议可以遵守协议,也就是说一个协议可以去遵守(继承)其它协议,这样就可以拥有其它协议的所有方法的声明。
    • 在协议中还有两个关键字@optional and @required,@optional 修改的方法声明告诉开发者可以这个方法可以实现,也可以不实现。@required修饰的方法声明告诉开发都这个方法必须实现,当然,这两个关键字修改的方法,都可以不去理会,但xcode会给出警告。

    二、协议定义格式

    1 // 定义的协议名称 遵守协议名称
    2 @protocol MyProtocol <NSObject>
    3 @required
    4 
    5 @optional
    6 
    7 @end

    三、例子

     1 // 委托者 DemoViewController.h
     2 #import <UIKit/UIKit.h>
     3 
     4 @protocol DemoDelegate <NSObject>
     5 - (void)setEditWithValue:(NSString *)aValue;
     6 @end
     7 
     8 @interface DemoViewController : UIViewController
     9 {
    10     id<DemoDelegate> iDelegate;
    11 }
    12 
    13 // 此delegate就是setDelegate方法
    14 @property (nonatomic, assign) id<DemoDelegate> iDelegate;
    15 
    16 @end
    17 
    18 // DemoViewController.m
    19 #import "DemoViewController.h"
    20 
    21 @interface DemoViewController ()
    22 {
    23     NSString *iVarString;
    24 }
    25 
    26 @property (nonatomic, copy) NSString *iVarString;
    27 
    28 - (void)print;
    29 
    30 @end
    31 
    32 @implementation DemoViewController
    33 @synthesize iDelegate;
    34 @synthesize iVarString;
    35 
    36 - (void)print
    37 {
    38     [self.iDelegate setEditWithValue:@"test"];
    39 }
    40 
    41 @end
    42 
    43 
    44 // 被委托者,要注意,在被委托中要设置代码理对象
    45 // DemoController.h
    46 #import <Foundation/Foundation.h>
    47 
    48 #import "DemoViewController.h"
    49 
    50 @interface DemoController : NSObject <DemoDelegate>
    51 
    52 @end
    53 
    54 // DemoController.m
    55 #import "DemoController.h"
    56 
    57 @interface DemoController ()
    58 {
    59     DemoViewController *iDVController;
    60 }
    61 
    62 @property (nonatomic, retain) DemoViewController *iDVController;
    63 
    64 - (instancetype)initWithValue:(NSString *)aValue;
    65 
    66 @end
    67 
    68 @implementation DemoController
    69 @synthesize iDVController;
    70 
    71 - (instancetype)initWithValue:(NSString *)aValue
    72 {
    73     if (self = [super init])
    74     {
    75         self.iDVController = [[DemoViewController alloc] init];
    76         [self.iDVController setIDelegate:self];
    77     }
    78     
    79     return self;
    80 }
    81 
    82 - (void)setEditWithValue:(NSString *)aValue
    83 {
    84     // to do
    85     NSLog(@"detail page edit value: %@", aValue);
    86 }
    87 
    88 @end

    PS: 在被委托中设置的代理对象,就是委托都的成员属性,即:@property delegate的getter and setter方法。 

    1 @interface DemoViewController
    2 {
    3   id<DemoController> iDelegate;  
    4 }
    5 
    6 @property (nonatomic, assign) id<DemoController> iDelegate;
  • 相关阅读:
    使用Swagger为ASP.NET Core WebApi生成API文档
    TypeScript入门笔记(五)
    TypeScript入门笔记(四)
    TypeScript入门笔记(三)
    .net core WebAPI+EF 动态接收前台json,并动态修改数据库
    记走出自动化部署的第一步
    工厂模式
    使用bootstrap fileinput多文件拖拽上传的记录
    判断登录跳回原地址方法
    使用Microsoft Teams 搭建远程视频
  • 原文地址:https://www.cnblogs.com/naray/p/4726587.html
Copyright © 2011-2022 走看看