美文网首页
block-注意事项

block-注意事项

作者: 正直走 | 来源:发表于2017-12-26 09:16 被阅读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;

待补充...

相关文章

  • block-注意事项

    block的变量传递如下例子分别声明一个局部变量、一个__block修饰的局部变量、一个静态变量和一个全局变量,并...

  • block-整理中

    block-整理中

  • Block

    block- 三种block__NSGlobalBlock__ NSStackBlock __NSMal...

  • block-类型

    从《block-底层数据结构》中,我们知道block的本质就是就是OC对象,他也有isa指针,它既然是对象,那它是...

  • Block-介绍

    Block简单介绍首先Block是iOS中比较特殊的一种数据类型Block是苹果官方比较推荐使用的数据类型,应用也...

  • Block-类型

    类型01 block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock...

  • block-循环引用

    block的循环引用,在日常开发中,我们常常遇到,但是可能部分新人还不太了解为何会循环引用,到底是如何循环引用理解...

  • __block-内存管理

    我们创建一个对象如果我们block内部用到了__block类型的变量,他会拥有这个对象,我们可以通过cpp文件来分...

  • 九、Block之(一)Block内部结构及调用本质

    一、Block内部数据结构 1.调用分析 2.关于block调用中 block->FunPrt()的理解 bloc...

  • 2022-04-19 iOS计时器引用解除问题

    我们使用NSTimer的时候,经常发生循环引用 以上代码产生循环引用环,self->timer->block->s...

网友评论

      本文标题:block-注意事项

      本文链接:https://www.haomeiwen.com/subject/gcwfqxtx.html