iOS block

导语

不会使用block的iOS程序员,不是一个合格的程序员
学会了block,你再也不想使用的代理
block没有你想象中的那么难,不要害怕,勇敢尝试

什么是Block

    block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。

block的定义

1. 使用typedef 定义 block
/** 无参无返回值*/
typedef void(^myBlock1)();
/** 无参有返回值*/
typedef void(^myBlock2)(NSString *string);
/** 有参有返回值*/
typedef NSString *(^myBlock3)(NSString *string);
2.block属性或变量

格式:返回值类型(^block名称)(参数列表)

/** 定义属性 block属性可以用string修饰 也可以用copy修饰*/
/** 无参无返回值*/
@property (nonatomic, strong) void(^myBlock1)();
/** 无参有返回值*/
@property (nonatomic, strong) void(^myBlock2)(NSString *string);
/** 有参有返回值*/
@property (nonatomic, strong) NSString *(^myBlcok3)(NSString *string);


{
    /** 定义变量*/
    void (^myBlock1)();
    void (^myBlock2)(NSString *);
    NSString *(^myBlock3)(NSString *);
}
3. block 被当做方法的参数

格式:(block类型)参数名称

/** 无参无返回值*/
- (void)test1:(void (^)())testBlock;
/** 无参有返回值*/
- (void)test2:(void (^)(NSString *string))testBlock;
/** 有参有返回值*/
- (void)test3:(NSString *(^)(NSString *))testBlock;

block常见雷区—循环引用

    使用block有一个特别要注意的地方,循环引用,何为循环引用?你引用我,我引用你,谁也不释放谁,对象无法销毁,占用内存

循环引用解决方法

循环引用如何解决?很简单,一行代码搞定

   __weak typeof (self) weakSelf = self;
    self.seveBlock = ^() {
    };
    使用weakSelf(名称随便取的)替代self,block将不再对self进行强引用
上面__weak也可使用__unsafe_unretained,区别就是__weak修饰的指针,当对象销毁后,指针会被自动置为nil,而__unsafe_unretained修饰的指针,当对象销毁后会变成野指针,为了安全,推荐使用__weak

这里有我写的详细的例子:GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值