[Blocks是指就是c語音中的函數指針]
Blocks最早是從蘋果本地的雪豹,移植到iPhone。官方建議多用blocks,在多線程應用比較廣泛
(1)Blocks 是什麼
(2)Blocks 和 c語音函數指針的區別
(3)如何調用Blocks
(4)代理2端如何通過Blocks通信
(1)Blocks 是什麼
和c語音函數指針類似,運行需要編譯器和運行時的支持(ios4.0開始支持 Blocks )
兩個對象之間通信,用到Blocks,相當於回調函數。
(2)Blocks 和 c語音函數指針的區別
(3)如何調用Blocks
typedef 定義:
_ _block關鍵字:
變成一個全局變量
blocs簡單用法:
block 申明:
void (^myblocks)(void) =NULL;
block 賦值:
myblocks = ^(void){
NSLog(@"in blocks");
};
block 調用:
myblocks();
例子1:
int (^myblocks2)(int a, int b) = ^(int a, int b){//賦值 int c = a+b; return c; } int ret = myblocks2(10,20);//執行
例子2:
__block int sum = 0;//變成全局變量 int (^myblocks3)(int a, int b) = ^(int a, int b){ sum = a+b; return sum; } myblock3(20,30);
例子3:
typedef int (^SumBlockT)(int , int);//定義一個類型 SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"sum: %d", a+b);return 0; } myblock4(10,12);
(4)代理2端如何通過Blocks通信
iphone開發用到的blocks:
人中定義一個blocks,狗每次定時調用這個blocks;
狗中定義一個blocks,用來存放人中的定義的blocks函數。
狗:
.h
void (^BarkCallback)(Dog *thisDog, int count);//變量
- (void) setBark:( void(^)(Dog *thisDog, int count))eachBark;//向外暴露這個函數,給人賦值的。
.m
- (void)updatatime:(id)arg
{
if(BarkCallblack)
{
BarkCallback(self, barkCount);
}
}
- (void) setBark:( void(^)(Dog *thisDog, int count))eachBark
{
[BarkCallblack release];
BarkCallblack = [eachBark copy];//copy是因為setDog函數可能被釋放。
}
-(void) dealloc
{
[BarkCallblack release];
[super dealloc];
}
人:
setDog函數裡面:
[_dog setBark:^(Dog *thisDog, int count){
NSLog(@"person dog %d count %d\n", thisDog.ID, count );
}]