黑馬程序員-2.block塊

吐槽:剛開始接觸iOS的時候真的挺不適應的,裏面出現了很多新玩意,不過還好我比較喜歡新鮮事物,以後整理些iOS中比較新穎的東西。

    block就是一個,不過有了block之後省去了上下翻代碼的麻煩,很好用,推薦!!

    

1.Block定義

Block是OC中的一種數據類型,在iOS開發中被廣泛使用

^是Block的特有標記,Block的實現代碼包含在{}之間

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

Block與C語言的函數指針有些相似,但使用起來更加靈活

示例

void(^demoBlock)() = ^ {
    NSLog(@"demo Block");
};
int(^sumBlock)(int, int) = ^(int x, int y) {
    return x + y;
};

格式說明:

(返回類型)(^塊名稱)(參數類型) = ^(參數列表) {代碼實現};

如果沒有參數,等號後面參數列表的()可以省略


2.當作參數傳遞

NSArray *array = @[@"劉", @"李", @"張", @"楊"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"第 %d 項內容是 %@", (int)idx, obj);
    if ([@"李" isEqualToString:obj]) {
        *stop = YES;
    }
}];

遍歷並NSLog() array中的內容,當obj 爲"李"時停止遍歷

//函數原型
enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {        *stop = YES;
}];



3.局部變量

int z=10;
int(^sumBlock)(int, int) = ^(int x, int y) {
    z=10;   //報錯
    return x + y +z;  
};

原因:在block外部的變量,在block中是隻讀的

解決辦法:在變量前加  __block 關鍵字 


4.傳遞對象

NSString *name=@"李";
NSArray *array = @[@"劉", @"李", @"張", @"楊"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"第 %d 項內容是 %@", (int)idx, obj);
    if ([name isEqualToString:obj]) {
        *stop = YES;
    }
}];

把name傳給block塊,Block塊會自動對指針進行強引用


5.typedef

使用typedef改寫官方的數組便利函數

官方的數組遍歷方法聲明如下:
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;


而如果使用typedef,則需要:
typedef void(^EnumerateBlock)(id obj, NSUInteger idx, BOOL *stop);

使用時直接寫:
- (void)enumerateObjectsUsingBlock:(EnumerateBlock)block;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章