————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————
一、Block
Block类型是OC的有一种特殊类型,它的作用是封装代码,以便于随时可以调用,提高效率。其实这与函数的作用很类似,只是函数需要在调用前声明,而Block类型是当做一种数据类型封装,然后随时调用的。
Block的标志:^
1.没有返回值,没有形参的block
定义Block的格式:
void (^myblock)() = ^{
......
};
void (^myblock) = ^{
......
};
2.有返回值,有形参的block
这种写法和指向函数的指针很类似:
int (^sumblock)(int, int) = ^(int a, int b)
{
......
}
3.block的修改
默认情况下,block内部不能修改外面的局部变量。但是,当给局部变量加上__block关键字,这个局部变量就可以在block内部修改。
例如:
int main()
{
int a = 10;
__block int b = 20;
void (^block)();
block = ^{
// block内部可以访问外面的变量
//NSLog(@"a = %d", a);
// 默认情况下,block内部不能修改外面的局部变量
// a = 20;
// 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = 25;
};
4. 利用 typedef 定义 block 类型
typedef int (^MyBlock)(int, int);
// 以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b) {
return a - b;
};
MyBlock b3 = ^(int a, int b) {
return a - b;
总结:
1)如何定义block变量
int (^sumBlock)(int, int);
void (^myBlock)();
2)如何利用block封装代码
^(int a, int b) {
return a - b;
};
^() {
NSLog(@"----------");
};
^ {
NSLog(@"----------");
};
3)block访问外面变量
(1)block内部可以访问外面的变量
(2)默认情况下,block内部不能修改外面的局部变量
(3)给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4)利用typedef定义block类型
typedef int (^MyBlock)(int, int);
// 以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b) {
return a - b;
};
MyBlock b3 = ^(int a, int b) {
return a - b;
};
二、Protocol协议
1.协议的概念
Protocol协议说白了就是一份声明,只要某个类遵守这份Protocol协议,就相当于拥有了这份协议所有的方法。
协议的定义方法如下:
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end
我们在这里顺便总结一下之前学习的内容:
:代表继承;()代表分类名称;<>代表遵守协议;
2.如何遵守协议
1)类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
......
@end
2)协议遵守协议
一个协议可遵守其他多个协议,多个协议之间用逗号隔开
一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
3)定义一个变量时,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
3.协议中方法声明的关键字
1)@required (默认) 要求实现,如果没有实现,会发出警告
2)@optional 不要求实现,不会有警告
4.基协议
NSObject是个基协议,是最基本的协议
NSObject中有许多最基本的方法,如:description、retain、release等等
每一个新的协议都要遵守NSObject协议,<NSObject>
5.协议的提前声明
一般我们如果要写协议或者类时,写@Protocol和@class进行声明,当真正要用到里面的东西的时候,再在.m文件中#import
@Protocol MyProtocol;
6.@property中声明的属性也可用作一个遵守协议的限制
@property<nonatomic, strong> 类名<协议名称> *属性名;
@property<nonatomic, strong> id<协议名称> 属性名;