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中的时候,编译器给我们做了弱引用。因此不会产生循环引用。
     
  • 相关阅读:
    20080619 SQL SERVER 输入 NULL 的快捷键
    20090406 Adobe的“此产品的许可已停止工作”错误的解决办法
    20080908 Office Powerpoint 2007 不能输入中文的解决办法
    20080831 ClearGertrude Blog Skin 's cnblogs_code class
    20080603 Facebook 平台正式开放
    20080519 安装 Microsoft SQL Server 2000 时提示 创建挂起的文件操作
    test
    Linux—fork函数学习笔记
    SOA的设计理念
    Why BCP connects to SQL Server instance which start with account of Network Service fail?
  • 原文地址:https://www.cnblogs.com/syios/p/4780670.html
Copyright © 2011-2022 走看看