------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
协议
常常用在代理的实现上。协议事实上是一组方法列表,它不依赖与特定的类,在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#、Java中使用interface定义接口了。协议的创建
与创建分类类似不过选择的创建的文件为Objective-C protocol(OC协议)。输入协议名,创建后会产生一个protocol.h的接口文件。
协议定义
通常,一个协议的定义是放在头文件中的,其语法形式如下:
@protocol 协议名 //一般都会在后面加上<NSObject>,表示协议的继承。
//方法声明;
@end
一般,在方法声明的前面,会有两个关键字进行修饰:一个是@optional,它表示声明的方法是可选的;一个是@required,它表示声明的方法是必须的。加上关键字的协议定义形式如下:
@protocol 协议名
@optional 可选方法声明;
@required 必须方法声明;
@end
协议在类中的声明
协议定义好以后,要在类中进行使用,首先要在类中进行协议的声明,其语
法形式如下:
@interface 类名:父类名<协议名>
@end
协议在类中的实现
协议声明好后,要在类的实现文件中定义在协议中声明的方法,其语法形式
如下:
@implementation 类名
类和协议中的声明方法的实现{
语法;
}
@end
具有多个协议的使用
在大多数情况下,一个类中是可以使用多个协议的,其语法形式如下:
@interface 类名:父类名 <协议1,协议2,协议3,.....协议n>
协议继承
即协议2使用了协议1,其语法形式如下:
@protocol 协议名2<协议名1>
声明方法;
@end
在OC中,默认为创建的协议都是在协议中使用协议,协议名1为NSObject,
其语法形式如下:
@protocol 协议名2<NSObject>
声明方法
@end
newProtocol.h
<span style="font-family:SimSun;font-size:14px;"> @protocol newProtocol <NSObject> //定义一个协议 @required //必须实现的方法
-(void)eat; @optional //可选实现的方法
-(void)run;-(void)sleep;@end</span>
Person.h
<span style="font-family:SimSun;font-size:14px;">#import <Foundation/Foundation.h>
#import "newProtocol.h"@interface Person : NSObject<newProtocol> //person采用newProtocol协议 @end
Person.m
#import "Person.h"@implementation Person-(void)eat{ //必须实现@required修饰的eat方法 NSLog(@"eating xiang!");}@end</span>
Block代码块
1. Block类型定义:返回值类型(^ 变量名)(参数列表)(注意Block也是一种类型);
2. Block的typedef定义:返回值类型(^类型名称)(参数列表);
3. Block的实现:^(参数列表){操作主体};
4. Block中可以读取块外面定义的变量但是不能修改,如果要修改那么这个变量必须声明_block修饰;
<span style="font-family:SimSun;font-size:14px;">//
// main.m
// block
//
#import <Foundation/Foundation.h>
typedef void (^Block)(); //将void(^)()类型命名成Block
void test (Block b){ //函数的形参为block类型
printf("我");
b(); //调用block
printf("喜欢玩LOL");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
Block b; //定义一个block变量b
printf("请输入一个数字:");
int i ;
scanf("%d",&i);
if (i) {
b = ^{ //给block变量赋值
printf("很");
};
}else{
b = ^{ //给block变量赋值
printf("不");
};
}
test(b); //调用函数
}
return 0;
}</span>
总结:
一个协议可以扩展自另一个协议。协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔;协议中不能定义属性、成员变量等,只能定义方法。