Objective-C Blocks

Block 相当于C或C++中的函数指针,相当于.NET或Java中的delegate

//Block声明

double (^blockName) (double, double) =

  ^ double (double firstParam, double secondParam){

    return firstParam * secondParam;

  }

 

//Block调用

double result = blockName(2,4);

 

block 会形成一个闭包

- (void) testMethod{

  int i = 42;

 

  void (^testBlock) (void) = ^{

   NSLog(@"%i", i); 

  };

 

  i = 84;

  testBlock();

}

这段代码中block i 的值42被testBlock capture了,即使在testBlock被调用之前修改i的值,testBlock的执行结果依然输出42. 而且在testBlock中即使修改 i 的值,也不会影响到原始的 i 的值。

 

可以使用 __block关键字,让在block外定义的变量能够被block内部的代码共享

__block int i = 42;

 

void (^testBlock) (void) = ^ {

  NSLog(@"%i", i);

  i = 100;

}

 

testBlock();

NSLog(@"%i", i);

这种情况下,输出结果为 42,100

 

block通常做为参数传递给方法,作为回调函数。block类型的参数一般放在方法参数列表的最后面

- (void) testMethod: (NSString *)str callback: (void(^) (void)) testBlock;

 

用typedef简化block语法

typedef void (^NothinBlock) (void);

这样就可以创建NothinBlock的实例,用来创建具有相同签名的block

NothinBlock callback = ^{

  ...

};

 

如果在一个class中定义一个block类型的属性,而这个block中capture了self的时候,可能会造成强引用循环

@interface Nothin : NSObject

@property (copy) void (^block) (void);

@end

 

@implementation Nothin

- (void) configureBlock{

  self.block = ^{

    [self doSomething];

  }

}

@end

 

因为self对block是强引用,而block中又capture了self,这个时候就造成强引用循环。为避免这种情况,需要在block中对self弱引用

- (void) configureBlock{

  Nothin * __weak weakSelf = self;

  self.block = ^{

    [weakSelf doSomething];

  }

}

这种情况下,当block执行完,对self的引用就解除了

 

转载于:https://www.cnblogs.com/SuuuperPig/p/3874596.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值