Block的使用中的注意点

  1. 在使用Block之前需要对其作判空处理
if (_completionBlock) {

        _completionBlock();

    }
  1. 在MRC的编译环境下,Block如果作为成员参数要Copy一下,讲栈上的Block拷贝到堆上 http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html
  2. Block作为类对象的成员变量,在Block中直接使用类对象会造成循环引用问题。解决方法:
    3.1. 执行完Block后,将Block置空(NULL); 在MRC下需要先release。
    3.2. 使用形参的方式避免直接使用Block块外的类对象。
    3.3. 使用__weak 的方法。
  3. 在多线程环境下(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的时候都会用到。

你可能感兴趣的:(Block的使用中的注意点)