看下面的代碼了讨,可以運行嗎内颗,運行過后結果又是啥了钧排。
^{
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);
}();
//帶有參數的常規(guī)調用
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);
//帶有返回值的常規(guī)調用
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 類型的,這樣可以解決循環(huán)引用朝抖,不然block的持有者釋放不了
- (void)exampleE
{
self.name = @"李明";
self.age = @"23";
__weak typeof(self) weakSelf = self;
self.block = ^{
//價格strong 可以讓self在block執(zhí)行完之前一直保存
__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"name = %@",strongSelf.name);
NSLog(@"age = %@",strongSelf.age);
};
self.block();
}
好啦啥箭,我的block講完了,如果您有更有意思的發(fā)現治宣,歡迎告訴我急侥。