block 其实就是一个代码块, 储存了一段代码.
block是一种数据类型. block类型的变量用(^blockName)形式表示.
block和函数相似, 可以有参数, 有返回值, 调用方式也相似.
但是函数必须定义在main函数的外面, block的定义位置可以任意. 函数不能访问它外部的局部变量, block可以.
1>没有参数的block
比如打印"Hello!"
// 定义 void (^printHello)() = ^{ NSLog(@"Hello!"); }; // 注:等号 ^后面其实有个(), 表示没有形参, 但是没有形参时可以省略 // 使用: printHello();
2>有参数的block
比如返回两个整数的和
// 定义 int (^sum)(int, int) = ^(int a, int b){ return a+b; }; // 使用 int s = sum(3, 5);
Block可以访问局部变量,但是不能修改。
int sum = 10; int (^MyBlock)(int) = ^(int num) { sum++;//编译报错 return num * sum; };
block的定义可以使用typedef来简化.
1>定义
typedef int (^CalcBlock)(int, int);
表示可以使用CalcBlock来定义有两个int参数, 返回值为int类型的block.
2>使用举例
<span style="font-size:18px;font-weight: normal;">CalcBlock sumBlock; // 表示sumBlock是一个CalcBlock类型的block sumBlock = ^(int a, int b){ return a+b }; // 给这个block赋值 CalcBlock mulBlock = ^(int a, int b){ return a*b }; // 定义+赋值</span>
1)、用来什么一堆方法(只声明不实现,且不能声明成员变量)
2)、只要某个类遵守了某个协议,就相当于拥有该协议中的所有方法声明
3)、只要父类遵守了某个协议,那么子类也遵守这个协议
@protocol 协议名称
//方法声明列表
@end
如:
@protocol MyProtocol
- (void)test1;
- (void)test2;
@end
1)、@required :声明的方法要求必须实现(若不实现,编译器会警告)
2)、@optional :声明的方法不要求实现
@protocol MyProtocol
_ (void)test; //默认@required,要求实现
@required
- (void)test1;
@optional //不要求实现
- (void)test2;
@end
1)、类遵循协议
@interface 类名 : 父类<</span>协议名称1, 协议名称2>
@end
@interface Person : NSObject
@end
2)、协议遵循协议
@protocol 协议名 <</span>其他协议名1, 其他协议名2>
@end
@protocol MyProtocol2
@end
类名<</span>协议名> *变量名;
id<</span>协议名> 变量名;
如:NSObject*obj;
id*obj1;
@property (nonatomic, strong) 类名<</span>协议名> *变量名;
@property (nonatomic, strong) id<</span>协议名> 变量名;
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) id dog2;
1)、如果这个协议只用在某个类中,应该把协议定义在该类中
2)、如果这个协议用在多个类中,应定义在单独文件中