block 是一种数据类型,它的作用是封装代码。
函数不能在方法内部或函数内部,但是block可以
定义block类型的变量的格式
返回值类型 (^block变量名称)(形参列表);
实现格式
^ 返回值类型 (形参列表){ 语句..... };
在block 中可以访问局部变量的,只能读取,默认不能修改。
默认在block内部不能修改局部变量的值
如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block,但是效率会变慢,同时block代码内部的变量名虽然相同,但是实际上是同步出来的变量,从而导致运行效率变慢。
函数不能在方法内部或函数内部,但是block可以
定义block类型的变量的格式
返回值类型 (^block变量名称)(形参列表);
实现格式
^ 返回值类型 (形参列表){ 语句..... };
在block 中可以访问局部变量的,只能读取,默认不能修改。
默认在block内部不能修改局部变量的值
如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block,但是效率会变慢,同时block代码内部的变量名虽然相同,但是实际上是同步出来的变量,从而导致运行效率变慢。
当你在block内部使用对象的时候,那么block内部就对这个对象有一个强引用,会在block出作用域的时候释放对象
#import <Foundation/Foundation.h>//------main
#import "LSMe.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.无参数,无返回值
void (^block)() = ^{
NSLog(@"hello");
};
block = ^{
NSLog(@"nihao");
};
block();
//2.有参无返回值
void (^block2)(int num1,int num2) = ^(int num1,int num2){
int a = num1 + num2;
NSLog(@"a = %d",a);
};
block2(1,2);
//3.有参有返回值
int (^block3)(int num1,int num2) = ^(int num1,int num2){
return num1 + num2;
};
int a = block3(2,3);
NSLog(@"a = %d",a);
//4.block做为参数
LSMe *me = [[LSMe alloc] init];
int b = [me test:^int(int num1, int num2) { //作为实参需要写入实际的代码
return num1 + num2;
}];
NSLog(@"b = %d",b);
/*
1、在block 中可以访问局部变量的
默认在block内部不能修改局部变量的值
如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block
*/
__block int c = 20; //如果想在block内部改变变量的值,加__block前缀修饰,但是效率变慢
void (^block4)()=^{
// c = 30;不能直接去改变变量的值,但是可以读取
// int c = 30; //在内部定义会覆盖外部的变量
c = 50; //当外部写了__block,同样是c,但其实是不同的,会在代码内保持同步,效率变慢
NSLog(@"c= %d",c);
};
block4();
NSLog(@"c= %d",c);
//当你在block内部使用对象的时候,那么block内部就对这个对象有一个强引用
void (^block5)()=^{
[me say]; //在block内部使用对象,可以理解为block5是一个强指针指向了对象
};
me = nil; //本来会在这行让LSMe释放,但是有block5的强指针指着,所以me是不会被释放的
}//当block5出作用域被销毁的时候,那么me也被释放了。
return 0;
}
#import <Foundation/Foundation.h>//------LSMe.h
@interface LSMe : NSObject
/*
作为函数参数类型的格式
返回值类型(^)(形参列表)
*/
- (int) test:(int (^)(int num1,int num2)) block;
- (void) say;
@end
#import "LSMe.h"//------LSMe.m
@implementation LSMe
- (int) test:(int (^)(int num1,int num2)) block{//这里的block传入的知识代码块
return block(4,5);
}
-(void)dealloc{
NSLog(@"%s",__func__);
}
- (void) say{
NSLog(@"hello");
}
@end