04OC之分类Category,协议Protocol,Copy,代码块block
一、Protocol协议
我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物。在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了另外一个关键字protocol来表示。
下面我们定义一个动物的协议AnimalDelegate,人Person需要实现这个协议。
Person.h文件
Person.m文件
二、Category分类
何为分类呢?一听这个概念可能很模糊。从C#的角度来说,相当于扩展方法(可以在不修改原本类的情况下使用自定义的方法)。利用分类我们就可以为已有的类添加一些新的方法,特别是系统或者框架的类。在C#字符串中有个Trim()的方法去除左右的空格,用起来很方便,但是在OC中没有,我们一起来扩充一下。
.h文件
#import <Foundation/Foundation.h>
@interface NSString(Extend) -(NSString *)stringByTrim; @end
.m文件
#import <Foundation/Foundation.h>
@interface NSString(Extend) -(NSString *)stringByTrim;
@end
main.m
#import <Foundation/Foundation.h> #import "NSString_Trim.h"
int main(int argc, const char * argv[]) { NSString *name=@" Kevin ";
//输出 NSLog(@"I'm %@",name); name=[name stringByTrim]; NSLog(@"I'm %@",name); return 0; }
三、代码块Block
在c#异步编程中我们经常需要进行函数回调,由于函数回调是异步执行了,如果按正常书写代码无法预知上一个方法什么时候结束,这个时候就要用到匿名委托或者是Lambada表达式将上一个操作为一个参数进行传递,其实在OC中也有类似的方法,称之为代码块。Block就是代码块,一个函数体,一个匿名函数,它是OC对于闭包的实现,在块状中我们可以持有或者引用局部变量,lambada表达式也可以,同时利用Block我们可以将一个操作作为一个参数进行传递,C语言的函数指针也是如此。下面我们使用Block进行点击监听:
KCButton.h:
KCButton.m:
main.m
执行结果如下:
上面的代码使用Block实现了按钮的点击事件,总结如下:
1.Block的类型定义:返回值类型(^变量名)(参数列表)
2.Block的typedef定义:返回值类型(^类型名称)(参数列表)
typedef void(^KCButtonClick)(KCButton *)
3.Block的实现:^(参数列表){操主体}
button.onclick=^(KCButton *btn){ NSLog(@"Invoke Onclikc the Method.The button is :%@",btn); };
4.Block中可以读取块外部定义的变量,但是不可以修改,如果要修改这个变量必须声明_block修饰