天天看點

iOS block 總結

^是Block的特有标記

Block的實作代碼包含在{}之間

大多情況下,以内聯inline函數的方式被定義和使用

系統中有自帶的inlineblock, Xcode裡直接敲就會出現block

例如:

void(^demoBlock)() = ^ {
    NSLog(@"demo Block");
};


int(^sumBlock)(int, int) = ^(int x, int y) {
    return x + y;
};
           

格式說明:

(傳回類型)(^塊名稱)(參數類型) = ^(參數清單) {代碼實作};

如果沒有參數,等号後面參數清單的()可以省略

在定義Block時,會在Block中建立目前局部變量内容的副本(拷貝)

後續再對該變量的數值進行修改,不會影響Block中的數值

如果需要在block中保持局部變量的數值變化,需要使用__block關鍵字

使用__block關鍵字後,同樣可以在Block中修改該變量的數值

在被當做參數傳遞時,Block同樣可以使用在定義之前聲明的局部變量

預設情況下,Block外部的變量,在Block中是隻讀的!

如果要修改Block之外的局部變量,需要使用__block關鍵字

使用時,避免block對指針做強引用,進而引起記憶體不能釋放問題。

可以使用typedef定義一個Block的類型,便于在後續直接使用。

Block是一種資料類型,那麼可以将Block當做比較特殊的對象。

局部變量預設都是強引用的,離開其所在的作用域之後就會被釋放

使用__weak關鍵字,可以将局部變量聲明為弱引用

block 定義屬性值,使用copy

@property (nonatomic, copy) BLOCKHANDLE finishBlock;

- (void)demoBlockOp
{
    // 不能用__weak
//    __weak DemoObj *weakSelf = self;
    // 隻有self直接強引用block,才會出現循環引用
    // block的管理以及線程的建立和銷毀是由隊列負責的,直接在block中使用self沒有關系!
    for (int i = 0; i < 10; ++i) {
        
        [self.queue addOperationWithBlock:^{
            //不能使用__weak
//            [weakSelf demoOp:@(i)];
            [self demoOp:@(i)];
        }];
    }
}