吐槽:剛開始接觸iOS的時候真的挺不適應的,裏面出現了不少新玩意,不過還好我比較喜歡新鮮事物,之後整理些iOS中比較新穎的東西。數組
block就是一個,不過有了block以後省去了上下翻代碼的麻煩,很好用,推薦!!
ide
1.Block定義函數
Block是OC中的一種數據類型,在iOS開發中被普遍使用spa
^是Block的特有標記,Block的實現代碼包含在{}之間指針
大多狀況下,之內聯inline函數的方式被定義和使用對象
Block與C語言的函數指針有些類似,但使用起來更加靈活ci
示例開發
void(^demoBlock)() = ^ { NSLog(@"demo Block"); }; int(^sumBlock)(int, int) = ^(int x, int y) { return x + y; };
格式說明:原型
(返回類型)(^塊名稱)(參數類型) = ^(參數列表) {代碼實現};it
若是沒有參數,等號後面參數列表的()能夠省略
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;