iOS开发 Block

2021-01-11  本文已影响0人  喜剧收尾_XWX

一、block分类

block是一中特殊的oc对象,主要分为以下3类

static NSString *indexString = @"xingweixin";
extern NSString *myExternString;
extern NSString *myExternString2;

 self.block = ^{
        //全局变量
        myExternString2 = @"fengmengyue";
        NSLog(@"_____%@",myExternString2);
        NSLog(@"_____%@",indexString);
        
    };
    self.block();
    NSLog(@"%@",[self.block class]);   //__NSGlobalBlock

(1)在MRC下访问了外部auto变量,则属于栈区block

int index = 15;
    void(^TestVCBlock)(void) = ^{
        NSLog(@"----%d",index);
    };
    TestVCBlock();
    NSLog(@"%@",[TestVCBlock class]);  //__NSStackBlock

(2) 在ARC下访问了外部变量,但没有强引用指向这个block

  int index = 15;
    NSLog(@"%@",[^{
        NSLog(@"----%d",index);
    } class]);

(1)在MRC下,用copy修饰__NSStackBlock后则为__NSMallocBlock

 void(^TestVCBlock)(void) = [^{
        NSLog(@"----%d",index);
    } copy];
    TestVCBlock();
    NSLog(@"%@",[TestVCBlock class]);

(2)在ARC下,ARC环境下只要访问了外部auto变量而且有强引用指向该block(或者作为函数返回值)就会自动将__NSStackBlock类型copy到堆上

 void(^TestVCBlock)(void) = ^{
        NSLog(@"----%d",index);
    } ;
    TestVCBlock();
    NSLog(@"%@",[TestVCBlock class]);

二、block特性

1.捕获自动变量

(1) 自动变量是什么时候被block捕获进去的?为什么值不能修改?

(2) 全局变量和静态全局变量值在block为什么能更改,局部静态变量的值为什么能更改?

(3)如何修改自动变量中的值

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
  NSMutableString * str = [[NSMutableString alloc]initWithString:@"Hello,"];
    
        void (^myBlock)(void) = ^{
            [str appendString:@"World!"];
            NSLog(@"Block中 str = %@",str);
        };
    
    NSLog(@"Block外 str = %@",str);
    
    myBlock();
    
    return 0;
}

https://www.jianshu.com/p/ee9756f3d5f6

上一篇 下一篇

猜你喜欢

热点阅读