block-注意事项

2017-12-26  本文已影响24人  正直走
  1. block的变量传递
    如下例子分别声明一个局部变量、一个__block修饰的局部变量、一个静态变量和一个全局变量,并且初始的值为1,在block中打印外部的值,而且在该block过去之后改变前面声明的变量值。如下:
@implementation ViewController

int param = 4;
- (void)viewDidLoad {
   [super viewDidLoad];
   
   int param1 = 1;
   static int param2 = 1;
   __block int param3 = 1;

   _block = ^{
       NSLog(@"%s----%d-%d-%d-%d",__func__,param, param1,param2,param3);
   };
   param = 2;
   param1 = 2;
   param2 = 2;
   param3 = 2;

   _block();
}

-[ViewController viewDidLoad]_block_invoke----2-1-2-2
打印日志如下,除了局部变量是1外其他都是2,在block中除了局部变量是传递外,其他的都是指针传递。

  1. MRC中没有强指针和弱指针的概念,所有属性都是基本数据类型,基本数据类型都放在栈里面
    在block内部使用外部指针且会造成循环引用情况下,需要用weak修饰外部指针 weak typeof(self) weakSelf = self;
    如例子block造成循环引用:Block会对其块里面的所有外部强指针变量变量全部引用一次。
#import "modelViewController.h"
@interface modelViewController ()
@property (nonatomic,strong) void(^block)();
@end
@implementation modelViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    int param = 1;
    _block = ^{
        NSLog(@"%@", self);
    };
    param = 2;
}
警告会出现retain cycle即循环引用

问问

  1. 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下__strong typeof(self) strongSelf = weakSelf;如一下代码:
 __weak typeof(self) weakSelf = self;
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 *
 NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     NSLog(@"%@", weakSelf);
 });
  1. 如果需要在block内部改变外部变量的话,需要在用__block修饰外部变量
int param = 1;
 void goToWork(WorkBlock workBlock)
{
     NSLog(@"%d", param);
}
//上面的结果是1

通过上面的block可以看出在block中访问外面的的变量是没有问题的,但是直接修改外面的变量的值是会报错的,如下param = 2;会报错。

void goToWork(WorkBlock workBlock){
    param = 2;
     NSLog(@"%d", param);
}

所以在修改block外部变量的值之前需要在前面加__block;

待补充...

上一篇 下一篇

猜你喜欢

热点阅读