码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——Block使用小结

时间:2017-10-19 19:54:50      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:返回   执行   通过   就会   void   错误   imp   编译   说明   

  Block语法看上去好像很特别,但它实际上是作为极普通的C语言源代码处理的。Block的实质,就是Objective-C的对象。

  1、Block的语法

  ^ 返回值类型 参数列表 表达式

  可省略返回值类型:^ 参数列表 表达式。省略返回值类型时,如果表达式中有return语句就使用该返回值的类型,如果表达式中没有return语句,就使用void类型。

  再省略参数列表:^ 表达式。这个就是大家最熟知的记叙方式。

    int val = 10;

    void (^blk)(void) = ^{

        printf("val = %d\n",val);

    };

    blk();

 

  2、__block说明符

  若想在Block语法的表达式中将值赋给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。不然就会产生编译错误。

    __block int val = 10;

    void (^blk)(void) = ^{

        val = 11;

    };

    blk();

    printf("val = %d\n",val);

  

  3、Block循环引用

  先看看下面的源代码吧!

typedef void(^blk_t)(void);

@interface MyObject : NSObject{

    blk_t blk_;

}

@end

@implementation MyObject

- (id)init {

    self = [super init];    

    blk_ = ^{

        NSLog(@"self = %@",self);

    };

    return self;

}

@end

  MyObject类对象的Block类型成员变量blk_持有赋值为Block的强引用。即MyObject类对象持有Block。init实例方法中执行的Block语法使用持有__strong修饰符的id类型变量self。并且由于Block语法赋值在了成员变量blk_中,因此通过Block语法生成在栈上的Block此时由栈复制到堆,并持有所使用的self。self持有Block,Block持有self。这正是循环引用。

  为避免循环引用,可声明附有__weak修饰符的变量,并将self赋值使用。

- (id)init {

    self = [super init];

    id __weak tmp = self;

    blk_ = ^{

        NSLog(@"self = %@",tmp);

    };

    return self;

}

 

iOS开发——Block使用小结

标签:返回   执行   通过   就会   void   错误   imp   编译   说明   

原文地址:http://www.cnblogs.com/yyt-hehe-yyt/p/7693877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!