基础应用

Block的类型划分

2019-11-04  本文已影响0人  小明讲啥故事

block如何分类?其实blcok的分类主要是根据block的内存管理来说的,系统把Block分为3类:NSGlobalBlockNSStackBlock, NSMallocBlock;

扩展:iOS内存五大区

栈区,堆区,静态区(全局区),常量区,代码区

全局Block

/**
   全局blcok ,内存全局区
   未引用任何局部变量
 */

NSString *globalStr = @"全局blcok变量引用";

- (void)globalBlock {

    //1、未引用任何外部变量
    void (^globalBlockTest) (NSString *) = ^(NSString *global){

        NSLog(@"%@",global);
    };

    NSLog(@"%@",globalBlockTest);

    //2、引用全局变量

    void (^globalBlockTest1)(void) = ^(){

        NSLog(@"%@",globalStr);
    };

    NSLog(@"%@",globalBlockTest1);

    globalBlockTest1();
}

堆区block(NSMallocBlock)


/**
   堆区 block , 引用局部变量的block
 */

- (void) mallocBlock {

    //局部变量
    NSString *mallocBlockStr = @"堆区block局部变量";

    void (^mallocBlock)(void) = ^(){
        NSLog(@"%@", mallocBlockStr);
    };

    NSLog(@"%@", mallocBlock);
    mallocBlock();
}

栈区Block (NSStackBlock)

/**
 栈区block
 */
- (void)stackBlock
{  

    NSString *stackBlockStr = @"栈区block变量";

    void (^stackBlock)(void) = ^{

        NSLog(@"%@", stackBlockStr);
    };  
    // ARC下 不将block赋值给 strong引用时。打印的block就是 NSStackBlock
    NSLog(@"block is %@", ^{  

        NSLog(@"%@", stackBlockStr);

    });
    // ARC下 将block赋值给 strong引用时。打印的block就是 NSMallocBlock
    NSLog(@"block is %@", stackBlock);

}

Block内存管理

Block自身内存管理

对于block,有两个内存管理方法:Block_copy, Block_release;Block_copy与copy等效, Block_release与release等效;

对引用变量的内存管理

在block中经常会用到外部变量/对象,如果这个block是存储在堆区,或者被复制到堆区,则对象对应的实例引用+1,当block释放后block的引用-1;

循环引用

因为block中会对引用的对象进行持有(引用计数+1),从而导致相互持有引起循环引用;解决这种问题的方式是对引用变量使用修饰词__block或者__weak;

上一篇下一篇

猜你喜欢

热点阅读