Objective-C中的Protocol

Protocol

简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现,这种模式一般称为(delegation)模式

在iOS中和OS X中,Apple采用了大量的代理模式来实现MVC中的View(UI控件)和Controller(控制器)

下面举个例子

声明一个Button类和Buttonlisterner类

在Button.h文件里

#import <Foundation/Foundation.h>

//类声明
@class Button;

//<>代表实现某个协议,NSObject为做根本的协议
//ButtonDelegate为协议的名称
@protocol ButtonDelegate<NSObject>

-(void)onClick:(Button*)but;

@end

@interface Button : NSObject

//nonatomic不需要多线程管理,delegate是按钮的监听器

@property(nonatomic,retain) id<ButtonDelegate> delegate;

-(void)Click;

@end

在Button.m文件里

#import "Button.h"

@implementation Button

//-(void)dealloc{
//    [super dealloc];
//}

-(void)Click{
    NSLog(@"Click按钮被点击了。。。");

    //如果有onClick:的方法则调用此方法
    if ([_delegate respondsToSelector:@selector(onClick:)]) {
        //并且告诉监听器哪个按钮被点击了
        [_delegate onClick:self];
    }

}
@end

在Buttonlisterner.h文件里

#import <Foundation/Foundation.h>
#import "Button.h"

//对协议提前声明,跟@class的作用是一样的

@protocol ButtonDelegate;

@interface Buttonlisterner : NSObject<ButtonDelegate>

@end

在Buttonlisterner.m文件里

#import "Buttonlisterner.h"
#import "Button.h"

@implementation Buttonlisterner

-(void)onClick:(Button *)but
{
    NSLog(@"onClick...");
}
@end

在main.m中

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Button* button = [[Button alloc]init];
        Buttonlisterner* listenter = [[Buttonlisterner alloc]init];
        button.delegate=listenter;
        [button Click];

    }
    return 0;
}

Objective-C中的Protocol

时间: 2024-10-10 08:15:49

Objective-C中的Protocol的相关文章

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

如何在 PHP 中处理 Protocol Buffers 数据

Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高.感兴趣的可以访问这里.Protocol Buffers官方只支持C++, Java, Python, C#, Go,如果想在PHP中使用Protocol Buffers,需要借助于第三方的扩展,使用方法如下. 安装protoc编译器 第一步,安装Google的protoc编译器,这个工具可以把pr

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

在C++中使用Protocol Buffer

之前我翻译过两篇关于protocol buffers的文章:<protocol buffers简单介绍><在Python中使用protocol buffers参考指南> 后来想想,现在自己是用在C++中的,不如再翻译一下,顺便看看自己的E文有没有提高.当然,查字典是少不了的. 翻译自:https://developers.google.com/protocol-buffers/docs/cpptutorial Protocol Buffer基础: C++ 这个教程是教你怎样在c++

objective C中的字符串

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

objective c, category 和 protocol 中添加property

property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 所以,在protocol中添加property时,其实就是添加了 getter 和 setter 方法,在实现这个protocol的类中,我们要自己手动添加实例变量 例: @synthesize name = _name; //此行代码即添加了实例变量及实现了protocol中属性的getter.s

[HMLY]12.iOS中的Protocol

最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property.查来查去,只是知道和protocol有关.晚上问了下朋友(iOS大神),结果被他一句点破.发现这部分知识点遗漏了一点. protocol类似java中的interface,主要是用来定义一套对象之间的通信规则.protocol也是我们设计时常用的一个东西,相对于直接继承的方式,protocol则偏向于组合模式.因为在设计对象的

OC中的protocol

一. 简单使用 1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 2. 格式 协议的编写 @protocol 协议名称 // 方法声明列表 @end 某个类遵守协议 @interface 类名 : 父类 <协议名称> @end 3. 关键字 协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流 @required:这个

Objective-C( protocol协议)

protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 <协议名称1, 协议名称2> @end 2> 协议遵守协议 @protocol 协议名称 <其他协议名称1, 其他协议名称2> @end 3.协议中方法声明的关键字 1> @required (默认) 要求实现,如果没