zoukankan      html  css  js  c++  java
  • Block的用法

    定义block

     无参数无返回值的block 定义格式:

    void (^block)() = ^{

    NSLog(@"block");

    };

    有参有返回值的block 定义格式

    int (^sum)(int,int) = ^(int a,int b){

    return a+b;

    };

    当然如果block作为成员属性的时候 定义的格式如下:

    @property (nonatomic, copy) void(^myBlock)();   //注意这个是block作为成员属性的时候的定义格式

    当然这里如果block作为成员属性  我们可以使用typedef为这个block起一个别名 这样就不用每次都写这么长的代码了:

    如:

    typedef  void(^myBlock)()   //这样就相当于给这个block起了一个别名 叫做  myBlock  那么以后使用的时候 就可以这样使用:

    @property (nonatomic, copy) myBlock block;   //注意这个是block作为成员属性的时候的定义格式

    当block当做参数传递的时候用如下格式:

    + get:(NSString*)url parames:(NSDictionary*)parames success:(int (^)(int,int))sum;  //这个block是一个有参数有返回值的

    + post:(NSString*)url parames:(NSDictionary*)parames success:(void (^)(id responseObj))responseObj;  //这个block是一个有参数 没有返回值的

    即可:也就是说block当做参数的时候 需要把block的名字提取出来放到最后面即可

    block其他注意点:

    由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃,

     在非ARC情况下, 我们要返回一个Block的话,需要 [Block copy];
     
     在ARC下, 以下几种情况, Block会自动被从栈复制到堆:
      
     1.被执行copy方法
     2.作为方法返回值
     3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时
     4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候
     
    在非ARC下,只虽一个__block关键词就可以解决循环引用的问题。相对还是简单的。
     
    那么在arc模式下 如何解决循环引用的问题呢?
     
    很多人以为写个__weak就行了
     
     __weak BlockDemo *demo = [[BlockDemo alloc]init];
    如果你这样写 那就犯了很大的错误: 这样定义一个变量  马上就被release 了  如果有
     
    解决方法是这样的:
    BlockDemo *demo = [[BlockDemo alloc]init];   
    __weak typeof(BlockDemo) *weakDemo = demo;
     
    注意:
    当一个对象中的block块中的访问自己的属性是不会造成循环引用的,因为把自身当作参数传到block中的时候,编译器给我们做了弱引用。因此不会产生循环引用。
     
  • 相关阅读:
    [Postman]历史(8)
    [Postman]响应(7)
    [Postman]请求(6)
    [Postman]查找替换(5)
    ORA-02050故障诊断一例
    转 js实践篇:例外处理Try{}catch(e){}
    转 PHP
    HTML DOM getElementById() 方法
    地点选择
    9i 和 11 g 区别
  • 原文地址:https://www.cnblogs.com/syios/p/4780670.html
Copyright © 2011-2022 走看看