黑马程序员(OC特有语法-block和-Protocol)
2014-08-24 13:58
423 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------
-block
1、Block封装了一段代码,可以在任何时候执行
2、Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
3、苹果官方建议尽、量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场的很多
Blocks的定义:
int (^MySum)(int,int)
= ^(inta,
intb) {
return
a+b;
};
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
intsum
=10;
int (^MyBlock)(int)
= ^(int num) {
sum++;//编译报错
return num *
sum;
};
如果要修改就要加关键字:__block
__block intsum=
10;
定义函数指针
int (*myFn)();
定义Blocks
int (^MyBlocks)(int,int);
调用函数指针
(*myFn)(10, 20);
调用Blocks
MyBlocks(10, 20);
在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
也可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
总之:block就是一个代码段,可以提高代码的灵活度。
--protocol
简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式
在iOS和OSX开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦
Protocol包含两个方法,btnClick:和btnInit:
这里还有两个关键字:@required和@optional,表示如果要实现这个协议,那么btnClick:方法是必须要实现的,btnInit:则是可选的,这两个关键字是在OC
2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现
Protocol的使用场景
OC的Protocol和Java的接口很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,可使用Protocol来描述它们的关系,不同的类,可以实现同一个Protocol
最常用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件的处理,都是通过委托的方式交给UIViewController完成。根据约定,框架中后缀为Delegate的都是Protocol,如UIApplicationDelegate,UITableViewDelegate等
Protocol的注意
一个Protocol本身是可以实现其它Protocol
例如:
@protocol MyDelegate <UIWebViewDelegate>
@end
可以使用conformsToProtocol判断某个类是否实现了某个Protocol
例如:
[objconformsToProtocol]:
@protocol(MyDelegate)];
block和protocol这两个关键字,使用都很频繁的
-------
-block
1、Block封装了一段代码,可以在任何时候执行
2、Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
3、苹果官方建议尽、量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场的很多
Blocks的定义:
int (^MySum)(int,int)
= ^(inta,
intb) {
return
a+b;
};
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
intsum
=10;
int (^MyBlock)(int)
= ^(int num) {
sum++;//编译报错
return num *
sum;
};
如果要修改就要加关键字:__block
__block intsum=
10;
定义函数指针
int (*myFn)();
定义Blocks
int (^MyBlocks)(int,int);
调用函数指针
(*myFn)(10, 20);
调用Blocks
MyBlocks(10, 20);
在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
也可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
总之:block就是一个代码段,可以提高代码的灵活度。
--protocol
简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式
在iOS和OSX开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦
Protocol包含两个方法,btnClick:和btnInit:
这里还有两个关键字:@required和@optional,表示如果要实现这个协议,那么btnClick:方法是必须要实现的,btnInit:则是可选的,这两个关键字是在OC
2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现
Protocol的使用场景
OC的Protocol和Java的接口很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,可使用Protocol来描述它们的关系,不同的类,可以实现同一个Protocol
最常用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件的处理,都是通过委托的方式交给UIViewController完成。根据约定,框架中后缀为Delegate的都是Protocol,如UIApplicationDelegate,UITableViewDelegate等
Protocol的注意
一个Protocol本身是可以实现其它Protocol
例如:
@protocol MyDelegate <UIWebViewDelegate>
@end
可以使用conformsToProtocol判断某个类是否实现了某个Protocol
例如:
[objconformsToProtocol]:
@protocol(MyDelegate)];
block和protocol这两个关键字,使用都很频繁的
相关文章推荐
- 黑马程序员-iOS基础之OC重点语法(Block、Protocol)
- 黑马程序员——OC语法 block和protocol
- 黑马程序员——OC---OC特有语法01
- 黑马程序员-[OC]学习之旅-block和protocol的概念及使用
- 黑马程序员---OC特有的语法
- 黑马程序员——OC基础---block,protocol
- 黑马程序员-OC语言基础:OC特有语法
- 黑马程序员--oc:特有语法1
- 黑马程序员-8-Objective-C学习笔记(OC特有语法)
- OC特有语法—Protocol
- 黑马程序员员—OC(block和protocol)
- 黑马程序员 oc的特有语法
- 黑马程序员_OC特有语法
- 黑马程序员_oc特有语法一:分类Category和类扩展
- 黑马程序员——OC语言——block、protocol、代理模式
- OC_语法入门_day6_ARC(循环引用)/block代码块(闭包)/protocol协议(接口)/代理模式
- 黑马程序员——OC语言------OC特有语法:分类、description、类对象、SEL
- 黑马程序员--oc:特有语法2
- 黑马程序员—OC(归纳总结OC特有的语法)
- 黑马程序员——OC基础---Block、protocol