ios—-protocol, optional ,delegate

ios—-protocol, optional ,delegate

ios—-protocol,delegate

 

 


protocol——协议

协议是用来定义对象的属性,行为和用于回调的。
协议中有两个关键字@private和@optional,@private表示使用这个协议必须要写的方法,@optional表示可选的方法,用不到可以不写。
就像UITableView,它有两个协议:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是规定行为操作的,里面的方法都是可选的方 法,UITableViewDataSource是规定数据存储结构的,有两个必选方法。因此你再实现UITableViewDataSource时必须要定义这两个方法,否则程序会出错。
如果你使用了响应的类或者控件,如果该类定义了协议,就可以根据需要实现该协议。

protocol和java里interface的概念类似,是Objective-C语法的一部分。
定义protocol如下

[cpp] view plaincopyprint?

1
2
3
4
5
6
@protocol ClassADelegate  

- (void)methodA;  
- (void)methodB;  

@end  
那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

函数是需要被实现的,所以如果对于class如下
[cpp] view plaincopyprint?


@interface ClassB <ClassADelegate> {  
}  
@end  
就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

有了上面这个头文件,我们就可以放心作调用
[cpp] view plaincopyprint?


ClassB *b = [[ClassB alloc] init];  
[b methodA];  
[b methodB];  
而不用担心出现unrecognized selector sent to instance这种错误了。

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。
[cpp] view plaincopyprint?


id<ClassADelegate> b = ...;  
[b methodA];  
这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。

delegate——委托,代理

适用场合:

类A调用类B, 当类B想回调类A的方法的时候, 要用到delegate

要理解下面的代码的话, 要知道的一个知识点是 协议(protocal)

文件:ClassA.h


#import <Foundation/Foundation.h>
#import "ClassB.h"
@interface ClassA : NSObject<SampleProtocal>
- (void)test;
@end
文件:ClassA.m

 
#import "ClassA.h"
@implementation ClassA


-(void)test{
    ClassB *classB = [[ClassB alloc] init];
    classB.delegate = self;

    [classB actionOfClassB];
}


-(void)callback{
    NSLog(@"这个方法会被类B调用");
}
@end
文件:ClassB.h


#import <Foundation/Foundation.h>

@protocol SampleProtocal <NSObject>
@required
- (void)callback;
@end


@interface ClassB : NSObject{
    id<SampleProtocal> delegate;
}
@property (nonatomic, retain) id<SampleProtocal> delegate;


- (void)actionOfClassB;


@end
文件:ClassB.m


#import "ClassB.h"


@implementation ClassB
@synthesize delegate;
-(void)actionOfClassB{
    [delegate callback];
}
@end
摘自:http://blog.csdn.net/mars2639/article/details/7310182


摘自:
http://blog.csdn.net/mars2639/article/details/7310182

转载于:https://www.cnblogs.com/someonelikeyou/p/3541753.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100828.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 手眼标定之基本原理

    手眼标定之基本原理文章目录一前言二Eye-in-Hand2.1基础知识准备2.2Eye-in-Hand基本原理三跋原文首发于微信公众号【视觉IMAX】。一前言机器人的视觉系统分为固定场景视觉系统和运动的「手-眼」视觉系统。摄像机与机器人的手部末端,构成手眼视觉系统。根据摄像机与机器人相互位置的不同,手眼视觉系统分为Eye-in-Hand系统和Eye-to-Hand系统。Eye-in-Hand…

  • Java虚拟机:深入详细分析Java ClassLoader原理与源码

    Java虚拟机:深入详细分析Java ClassLoader原理与源码

  • android开发之滑动效果实现图片浏览_ViewFilpper的使用

    ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。又ViewAnimator继承至于FrameLayout的,所以ViewFilpper的Layout里面可以放置多个View 本示例通过ViewFlipper和GestureDetector.OnGestureListener实现自

  • 信贷风控模型搭建及核心风控模式分类

    信贷风控模型搭建及核心风控模式分类一、当前风控模式现状近年来,信用风险管理发展呈现出数据化、模型化、系统化、自动化和智能化的特点。传统的人工专家经验正逐步被模型与算法替代。因此,科技较为领先的金融服务公司会选择采用模型方式完成对借款人的自动评估与审批。目前,对于信贷审核来说主要基于的风控模式为IPC、信贷工厂、大数据三种,每一种都有自己不同的侧重点。二、最核心的风控模式分类1.IPC模式IPC模式起源于德国邮储银行,该模…

  • Python面试常见问题_python面试问题总结

    Python面试常见问题_python面试问题总结Python是什么?简述并说明优点和缺点?Python是一种面向对象的解释性计算机编程语言,它是结合了解释性、编译性、互动性和面向对象的脚本语言。优点:开源、免费、简单、易学、可移植、可扩展、易维护、开发效率高。缺点:运行速度慢、代码不能加密。Python是如何被解释的?Python是一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译…

  • kubeadm部署高可用kubernetes

    kubeadm部署高可用kubernetes1准备环境(所有主机执行)1.1主机列表cat>>/etc/hosts<<EOF192.168.3.71k8s-master01192.168.3.72k8s-master02192.168.3.73k8s-master03192.168.3.74k8s-worker01192.168.3.75k8s-worker02192.168.3.76k8s-worker03192.168.3.77k8s-worker04

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号