- 在使用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的时候都会用到。