文章出處

摘自:http://www.cnblogs.com/ltpblog/p/3684127.html

 Date : 2015-12-4

 

1. Block定義

1) 說明:

a. Block是OC中的一種數據類型,在iOS開發中被廣泛使用
b. ^是Block的特有標記
c. Block的實現代碼包含在{}之間
d. 大多情況下,以內聯inline函數的方式被定義和使用
e. Block與C語言的函數指針有些相似,但使用起來更加靈活
 
2)  格式:
(返回類型)(^塊名稱)(參數類型) = ^(參數列表) {代碼實現}
注:如果沒有參數,等號后面的參數列表可以刪除。
 
3)例子:
(void) (^myBlock)(int, int) = ^(int a, int b) {
  return a + b;
}
 
2. Block需要注意的問題

問題一:

Block可以使用在定義之前聲明的局部變量

int i = 10;

void(^myBlock)() = ^{

    NSLog(@"%d", i);

};

i = 100;

myBlock();

該段代碼的輸出結果為10.
注意:
a. 在定義Block時,會在Block中建立當前局部變量內容的副本(拷貝)
b. 后續再對該變量的數值進行修改,不會影響Block中的數值
c. 如果需要在block中保持局部變量的數值變化,需要使用__block關鍵字
d. 使用__block關鍵字后,同樣可以在Block中修改該變量的數值
 

問題二:

block可以使用block之前的局部變量,但是不能對其進行修改。

BOOL flag = NO;

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    if ([@"王五" isEqualToString:obj] || idx == stopIndex) {

        *stop = YES;

        flag = YES;      // 編譯錯誤!!!

        }

}];

上述代碼編譯時,有語法錯誤。
注意:
1. 默認情況下,Block外部的變量,在Block中是只讀的。
2. 如果需要修改外表變量的值,需要在聲明變量時加上__block關鍵字。
 

問題三:

傳遞對象

NSString *stopName = @"王五";

NSArray *array = @[@"張三", @"李四", @"王五", @"趙六"];

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    NSLog(@"第 %d 項內容是 %@", (int)idx, obj);

    if ([stopName isEqualToString:obj] || idx == stopIndex) {

        *stop = YES;

    }

}];

注意:

為保證Block中的代碼正常運行,在將stopName的指針傳遞給Block時,Block會自動對stopName的指針做強引用。
 

問題四:

循環引用

@property (nonatomic, strong) NSMutableArray *myBlocks;

#pragma mark 將代碼改為調用self的方法

int(^sum)(int, int) = ^(int x, int y) {

    return [self sum:x y:y];

};

[self.myBlocks addObject:sum]; 

#pragma mark 對象被釋放時自動調用

- (void)dealloc

{

    NSLog(@"DemoObj被釋放");

}

注意: 
1. 循環引用的結果就是對象無法被釋放。
2. 局部變量默認都是強引用的,離開其所在的作用域之后就會被釋放。
3. 使用__weak關鍵字,可以將局部變量聲明為弱引用

__weak DemoObj *weakSelf = self;

在Block中引用weakSelf,則Block不會再對self做強引用

int(^sum)(int, int) = ^(int x, int y) {

    return [weakSelf sum:x y:y];

};

 

推薦:

ios block常見的錯誤(一)

ios block常見的錯誤(二)——循環引用

ios block常見的錯誤(三)——并發編程的block引用

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()