- 在使用Block之前需要對其作判空處理
if (_completionBlock) {
_completionBlock();
}
- 在MRC的編譯環境下,Block如果作為成員參數要Copy一下,講棧上的Block拷貝到堆上 http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html
- Block作為類對象的成員變量,在Block中直接使用類對象會造成循環引用問題。解決方法:
3.1. 執行完Block后,將Block置空(NULL); 在MRC下需要先release。
3.2. 使用形參的方式避免直接使用Block塊外的類對象。
3.3. 使用__weak 的方法。 - 在多線程環境下(Block中的weakSelf有可能被析構的情況下),需要將weakSelf再次引用一次(將weakSelf轉位strong指針)來防止weakSelf被析構的可能; ——weak–strong dance
///AFNetworking,堪稱使用weak–strong dance的經典。
__weak __typeof(self)weakSelf = self;
AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf.networkReachabilityStatus = status;
if (strongSelf.networkReachabilityStatusBlock) {
strongSelf.networkReachabilityStatusBlock(status);
}
};
參考:
http://blog.csdn.net/fhbystudy/article/details/17350951
http://stackoverflow.com/questions/10892361/generic-typeof-for-weak-self-references
http://stackoverflow.com/questions/14877415/difference-between-typeof-typeof-and-typeof-objective-c
http://rocry.com/2012/12/18/objective-c-type-of/
http://fuckingblocksyntax.com/ 這是個工具網站,我每次寫block的時候都會用到。