OC----protocol语法

Protocol(类似java中的接口interface)

  • 简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式
  • 在iOS和OS X开发中,apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦

在java中接口中的方法是公共的,如果你实现了接口,你要实现接口中的所有方法

而OC中的Protocol与java中的接口不太相同,如果要实现Protocol中的方法,可以独立实现,不需要一次实现全部的Protocol内的方法

例如:

@protocol ButtonDelegate<NSObject>
-(void)onClick;
@end

@interface Button:NSObject
@property(nonatomic,retain) id<ButtonDelegate> delegate;
@end
点击按钮例子:

//初始化一个按钮
Button*btn=[[Button alloc]init];
//初始化一个按钮的监听器
ButtonListener *listener=[[ButtonListener alloc]init];
//设置按钮的监听器
btn.delegate=listener;
//点击按钮
[btn onClick];

在Button.m文件中实现click方法:

-(void)onClick{
   [ _delegate onClick]
}

在使用@protocol的时候可以用跟@class相同的用法,在声明的时候不用import.h文件,只是在实现的时候import就可以了,

同样,我们可以重写click方法去实现在监听器里打印出是哪个按钮被点击了

-(void)click{
   //按钮被点击,通知监听器,并告诉监听器,是哪个按钮被点击了
   if ([_delegate respondsToSelector:@selector(onClick:)]){
       [_delegate onClick:self];
      }else{
          NSLog(@"监听器并没有实现onClick:方法”)
}

同样的,我们可以在一个类里边同时实现两个或者多个protocol

例如:

@protocol Study,Learn;

@interface Student:NSObject <Study,Learn>

如果在@protocol中使用了@required关键字,那么就表示@required下边的方法都必须实现

例如:

@required

-(void)test;

-(void)test1;

-(void)test2;

对于@required,虽然字面上说是必须实现,但是编译器并不强求某个类必须进行实现

如果在@protocol中使用了@optional关键字,那么就表示@optional下边的方法是选择实现的

例如:

@optional

-(void)test4;

查看某个类的对象有没有遵守某个协议,用conformsToProtocol关键字

例如:

if([stu conformsToProtocol:@protocol(study)]){

}

查看某个类的对象有没有实现某个方法,用respondsToSelector关键字

例如:

if([_delegate respondsToSelector:@selector(onClick:)]){

}

时间: 2024-10-05 19:01:57

OC----protocol语法的相关文章

iOS开发——面试篇&amp;OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的

OC点语法和变量作用域

OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 { 5 int _age;//默认为@protected 6 } 7 8 - (void)setAge:(int)age; 9 - (int)age; 10 11 @end Person类的实现: 1 #import "Person.h" 2 3 @imp

[Objective-c 基础 - 2.2] OC弱语法、类方法

A.OC弱语法 1.在运行的时候才会检查方法的声明和实现 2.没有声明只有实现的方法也能正常运行,只要在调用之前定义即可 3.类的声明必须存在,否则会出现运行时错误 B.类方法 1.是类名调用的方法 2.使用加号修饰的方法 3.类方法和对象方法可以重名 4.对象方法和类方法都允许多次声明,都不允许多次定义 5.类方法不能访问实例变量 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 - (void) t

【黑马程序员】————OC特有语法

一.点语法 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age]; 二.成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在

OC中语法糖,最新语法总结

<span style="font-size:24px;"> 1.方法与顺序无关 2.枚举绑定数据类型 enum { ObjectiveC, Java, Ruby, Python, Erlang }; typedef NSUInteger Language; 3. 属性不用写@synthesize 4.语法简化 4.1 NSNumber NSNumber *value; value = @12345; value = @123.45f; value = @123.45; v

黑马程序员-OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如下 // 声明 @interface  类名  (分类名称) @end // 实现 @implementation 类名 (分类名称) @end 2:分类的好处,当一个类比较庞大时,不同的部分可以放到不同的分类中,也方便团队中类的开发: 3:分类使用注意: a:分类不能增加成员变量,只能对原类增加方

黑马程序员—OC点语法和成员变量作用域

一.点语法 1.OC中点语法是方便从事别的语言开发的程序员迅速的转到OC开发当中,先看下面这个例子: 1 // 声明一个Person类 2 @interface Person : NSObject 3 { 4 int _age; 5 NSString *_name; 6 } 7 - (void)setAge:(int)age; 8 - (int)age; 9 @end 10 11 // 实现Person类 12 @implementation Person 13 - (void)setAge:(

【OC基础语法考试】

OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 试题如下: 1.将包含以下三个字符串@“1hello“,@“2word“,@”3good“的数组改写为字典,数字部分作为key,英文部分作为value.(15) 2.建立一个数组对象,使用3个不同的方法,使其引用计数增加为4,输出这个值,然后保证内存能够正确释放.(15) 3.使用

oc语言--语法

一.OC简介 1.简介 它是C语言的基础上,增加了一层面向对象语法 OC完全兼容C语言 可以在OC代码中混入C语言代码,甚至是C++代码 可以使用OC开发mac OS X平台和IOS平台的应用程序 2.关键字 1> 基本上所有的关键字都是以@开头 2> 关键字 @interface.@implementation.@end @public.@protected.@private.@selector @try.@catch.@throw.@finally @protocol.@optional.

oc总结 --oc基础语法相关知识

m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { theme manager @autoreleasepool { NSLog(@"Hello, World!"); } return 0; } 预处理指令import会自动检验头文件有没有被包含过,防止重复包含,NSLOG是日志输出,OC字符串以@开头,自动换行