首先不介紹block的基本概念等,推薦對block的精華闡釋:block一點也不神秘
其次說說我的理解:
1. ?屬性block是可以類比代理來傳值的。 因為block里面含參數(shù)
例如: 設(shè)VC2中有個block的屬性,在VC1中初始化VC2,并拿到VC2的block屬性,定義block,也是就VC1拿到block中的參數(shù)do sth。
在VC2中調(diào)用block并傳參數(shù),并執(zhí)行block即可。
這樣就是VC2把參數(shù)傳給block,然后執(zhí)行block,此時VC1拿到block中的參數(shù),do sth。
這種情況相當(dāng)于:VC1是VC2的代理。block是協(xié)議。
誰要讓代理做事,誰就要有block作為屬性。
2. block作為方法中的參數(shù)。
我的理解為:block就是代碼塊,一段特定的代碼。當(dāng)執(zhí)行這個方法時,方法會在適當(dāng)?shù)臅r候調(diào)用作為參數(shù)的block 。
注意:block里面的參數(shù),是這個方法給的,相當(dāng)于已知條件。方法傳參數(shù)給這個block,你來決定這個block應(yīng)該做哪些事。
關(guān)鍵是:block作為參數(shù),是由外部定義的,因此想干嘛干嘛。再次推薦精華block一點也不神秘。
3. block的缺點:如果A要B做某事,就必須B去實現(xiàn)A的block屬性。那么現(xiàn)在最關(guān)鍵的問題是,當(dāng)B要實現(xiàn)A的block時,B必須能夠拿到A。
這才是block最關(guān)鍵的地方?。。?/h1>
4.? 用__WEAK 來解除循環(huán)引用,注意要關(guān)聯(lián)對象啊。
//獲得頭像后顯示出來
//獲得頭像后顯示出來
__weakmeLeft*weakMe ;
headVC.passImage= ^(UIImage*image){
weakMe.headImageView.image= image;
};
這段白寫了,因為__weakmeLeft*weakMe ;沒有指向任何對象啊,僅僅只是一個空指針啊。
應(yīng)該這樣寫:__weak meLeft*weakMe = me;
__weak typeof(self) weakSelf =self;
5. block用作函數(shù)的參數(shù)
兩種方法:
A> 直接法:直接寫在函數(shù)參數(shù)里面:- (void)abc:(void (^)(NSString *temp))para ;
B>間接法:利用typedef 定義一個block類型 再把它加到函數(shù)參數(shù)里面去
//定義了一個block類型 叫completionBlock
typedef void(^completionBlock)(NSString *content,NSString *ispraised);