150. block内部访问外部变量。
8. block内部访问外部变量
1). 在block代码块的内部可以取到定义在外部的变量的值,定义在外部的局部变量或全局变量。
2). 在block代码块的内部可以修改全局变量的值,但是不能修改定义在外部的局部变量的值。
3). 如果要修改外部的局部变量,定义局部变量的时候加上__block
标识。
typedef void (^NewType)();
int num1 = 100; // 全局变量
int main(int argc, const char *argv[]) {
__block int num2 = 200; // 局部变量,添加__block修饰符,让block内部可修改。
NewType block1 = ^{
int num3 = 300; // 局部变量
num2++;
NSLog(@"num2 = %d", num2);
};
block1();
}
151. block作为函数的参数。
1). 为这个函数定义1个参数,定义1个block类型的参数。
无参数的无返回值的block。
typedef void (^NewType)();
void test (NewType block1) {
NSLog(@"~~~~~~~~~~~");
block1();
NSLog(@"~~~~~~~~~~~");
}
2). 如何为函数定义block类型的参数?
a. 就是在小括号中,声明1个指定格式的block变量就可以了。
b. 可以使用typedef简化定义,这样看起来更简洁。
3). 如何调用带block参数的函数?
a. 如果要调用的函数的参数是block类型的,那么要求在调用的时候,传入1个和形参block要求的代码段。
NewType type = ^ {
NSLog(@"哈哈");
NSLog(@"呵呵");
NSLog(@"嘿嘿");
};
test(type); // 传入block,
b. 调用的时候,可以先将代码段存储到1个block变量中,然后再传递这个block变量。
也可以直接将符合要求的代码段,写在小括号中传递。
test(^ {
NSLog(@"哈哈");
NSLog(@"呵呵");
NSLog(@"嘿嘿");
});
void test2(int (^paramsBlock)(int num1,int num2)){
NSLog(@"-----------");
int sum = paramsBlock(10, 10);
NSLog(@"sum is: %d", sum);
NSLog(@"-----------");
}
// block作为函数的参数。
test2(^int(int num1, int num2){
return num1 + num2;
});
c. 技巧:通过Xcode提示,可以快速生成block代码段的框架。
4). block作为函数的参数,能实现声明样的效果?
可以将调用者自己写的1段代码,传递到 函数的内部去执行。
153. block作为函数的参数--案例2。
@interface CZArray {
int _arr[10];
}
- (void)bianLiWithBlock:(void (^)(int val))processBlock;
@end
@implementation CZArray
- (instancetype)init {
if(self = [self init]) {
for(int i=1; i<11; i++) {
_arr[i-1] = i*10;
}
}
return self;
}
/// 遍历数组中每个元素,然后根据自定义的block方法,做处理
- (void)bianLiWithBlock:(void (^)(int val))processBlock
{
for(int i=0; i<10; i++) {
// 调研这自己写1端代码,来处理遍历出来的元素。
// NSLog(@"%d", _arr[i]);
processBlock(_arr[i]);
}
}
@end
CZArray *arr = [CZArray new];
[arr bianLiWithBlock: ^(int val) {
NSLog(@"val = %d", val+1);
}];
154. block作为函数的返回值。
当将block作为返回值,返回值的类型,就必须是用typedef定义的短的类型。
typedef void (^NewType)();
NewType ttt() {
void (^block1)() = ^ {
NSLog(@"~~~~~~");
};
return block1;
}
NewType type = ttt();
type();
155. block与函数的异同。
- 函数与block的相同点: 都可以封装一段代码.
- 函数与block的不同点:
1). block是一个数据类型,函数是一个函数
2). 我们可以声明block类型的变量,函数就只是函数
3). block可以作为函数的参数.
156. 协议的基本使用
a).
b).
157. 协议的基本使用
158. 协议的基本使用
// SportProtocol.h
@protocol SportProtocol <NSObject>
@required
- (void)run;
@optional
- (void)sleep;
@end
// Dog.h
import "MyProtocol.h"
@interface Dog: NSObject <MyProtocol>
@end
// 实现Dog类中的run,sleep方法。
Dog *dog = [Dog new];
[dog run];
[dog sleep];
--------------------------------------------------
--------------------------------------------------