看下面的代码,可以运行吗,运行过后结果又是啥了。
^{
NSLog(@"hello world");
}();
O(∩_∩)O哈哈~,第一眼看着个我感觉不可以运行,可是当我Run了一下后,竟然神奇的输出了hello world,😝😝😝... 只因以前只注重实用的东西,没有认真的去看Block,只是想会用就可以了,想想就有点惭愧啊,遂决定痛改前非,做回我的程序员。
网上有很多讲block的实质和应用了,我来点新鲜的,ChiCo眼中的Block。啦啦啦... 大师们看到了可以随便喷,哈哈! Block 是可以带参数和定义变量的() 调用可以带返回值的{}。下面是一组比较另类的block
void exampleA() {
//常用的用block变量名调用block
char a = 'A';
void (^block1)() = ^{
printf("%c",a);
};
block1();
//不需要名字的另类直接调用
^{
printf("%c",a);
}();
//带有参数的常规调用
void (^block2)(int a,int b) = ^(int a, int b){
NSLog(@"a + b = %d",a+b);
};
block2(2,3);
//带有参数的另类直接调用
^(int a, int b){
NSLog(@"a + b = %d",a+b);
}(2,3);
//带有返回值的常规调用
int (^block3)(int a,int b) = ^(int a, int b){
NSLog(@"a + b = %d",a+b);
return a + b;
};
int result1 = block3(4,5);
NSLog(@"result1 %d",result1);
//带参数和返回值的直接调用
int result2 = ^(int a, int b){
NSLog(@"a + b = %d",a+b);
return a + b;
}(6,7);
NSLog(@"result2 %d",result2);
}
block 还可以放到数组里边,我滴个神啊
void exampleB()
{
NSMutableArray *array = [NSMutableArray array];
exampleB_addBlockToArray(array);
//搞个block变量来调用
void (^block)() = [array objectAtIndex:0];
//返回结果直接转block,立马调用
((void (^)())[array objectAtIndex:0])();
//括号包住类型就可以强转
((aBlock)[array objectAtIndex:0])();
//隔一会在调用
block();
}
void exampleB_addBlockToArray(NSMutableArray *array)
{
char b = 'B';
[array addObject:^{
printf("%c",b);
}];
}
有意思吧,(≧▽≦)/啦啦啦, 下面简单的做点block使用注意笔记
//1. typedef 一个block后可以很方便的使用block
typedef void (^aBlock)();
void exampleC()
{
exampleC_getBlock()();
}
aBlock exampleC_getBlock()
{
char c = 'C';
return ^{
printf("%c",c);
};
}
2.在block中要修改局部变量,需要加上关键字__block
void exampleD()
{
__block int a = 100;
void (^block1)() = ^{
NSLog(@"a= %d",a);
a = 99;
NSLog(@"a= %d",a);
};
block1();
NSLog(@"a = %d",a);
int (^block2)(int a1) = ^(int a1){
NSLog(@"a1 = %d",a1);
a1 = 10;
NSLog(@"a1 = %d",a1);
return a1;
};
int result = block2(3);
NSLog(@"result = %d",result);
}
3.block的持有者如果要在block中使用持有者的东西,需要将持有者变成__weak 类型的,这样可以解决循环引用,不然block的持有者释放不了
- (void)exampleE
{
self.name = @"李明";
self.age = @"23";
__weak typeof(self) weakSelf = self;
self.block = ^{
//价格strong 可以让self在block执行完之前一直保存
__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"name = %@",strongSelf.name);
NSLog(@"age = %@",strongSelf.age);
};
self.block();
}
好啦,我的block讲完了,如果您有更有意思的发现,欢迎告诉我。
网友评论