Block簡(jiǎn)介
Block的使用
1 如何用block實(shí)現(xiàn) hello worldI逃印8ぁ舷礼!
void (^aBlock)(void) = ^(void){ NSLog(@"Hello, World!"); };
aBlock();
解釋一下上面那段東西時(shí)鬼東西把鹃彻。首先 void 表示block的返回值為void。然后就是(^aBlock) 表示這個(gè)block的名字叫 aBlock妻献。然后就是 (void) 表示 這個(gè)block 沒(méi)有參數(shù)蛛株。
簡(jiǎn)而言之就是: 返回類(lèi)型(^Block名字)(形式參數(shù))
然后等號(hào)之后就是一個(gè)類(lèi)似于匿名函數(shù)的東西。^(沒(méi)有參數(shù)){具體實(shí)現(xiàn)}育拨。
Important Pont:Block的內(nèi)存是分配在棧上的谨履。
2 block中修改外部變量
這個(gè)答案是NO。block中不允許隨意修改一般的外部變量熬丧。因?yàn)閎lock支持并行運(yùn)行笋粟,多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)一個(gè)變量是有問(wèn)題的一件事。所以要加 __block.或者是static 變量.
__block int blockLocal = 100;
static int staticLocal = 100;
void (^aBlock)(void) = ^(void){
NSLog(@" >> Sum: %d\n", global + staticLocal);
global++;
blockLocal++;
staticLocal++;
};
aBlock();
Block 在GCD中的總結(jié)
1 結(jié)合GCD在異步隊(duì)列中的block
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void)
{
int sum = 0;
for(int i = 0; i < Length; i++)
sum += data[i];
NSLog(@" >> Sum: %d", sum);flag = YES;
});
// wait util work is done.//
while (!flag);
dispatch_release(queue);
如果沒(méi)有這個(gè)while 主線(xiàn)程就會(huì)馬上結(jié)束,因?yàn)?block中的操作時(shí)放在異步線(xiàn)程中的矗钟。家while的目的是為了讓主線(xiàn)程等待唆香,block結(jié)束。
2 block按照 FIFO的原則
block按照 FIFO的原則去執(zhí)行吨艇,也就是先添加到異步隊(duì)列中的block有有限執(zhí)行權(quán)力(同一線(xiàn)程中,遵循FIFO)腾啥。
我們可以通過(guò)型號(hào)量機(jī)制來(lái)看看东涡。
// Create a semaphore with 0 resource
//
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block dispatch_semaphore_t taskSem = dispatch_semaphore_create(0);
// create dispatch semaphore
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_block_t task1 = ^(void) {
int s = 0;
for (int i = 0; i < Length; i++)
s += data[i];
sum = s;
NSLog(@" >> after add: %d", sum);
dispatch_semaphore_signal(taskSem);
};
dispatch_block_t task2 = ^(void) {
dispatch_semaphore_wait(taskSem, DISPATCH_TIME_FOREVER);
int s = sum;
for (int i = 0; i < Length; i++)
s -= data[i];
sum = s;
NSLog(@" >> after subtract: %d", sum);
dispatch_semaphore_signal(sem);
};
dispatch_async(queue, task1);
dispatch_async(queue, task2);
// wait for the semaphore: wait until resource is ready.
//
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(taskSem);
dispatch_release(sem);
dispatch_release(queue);
這里大致就是用GCD 實(shí)現(xiàn)了依賴(lài)。
參考和致謝
link:http://www.cnblogs.com/kesalin/archive/2011/08/26/block_dispatch_queue.html