美文网首页程序员
Block为什么用copy修饰

Block为什么用copy修饰

作者: liuyihua的技术修炼场 | 来源:发表于2018-03-29 10:08 被阅读28次

默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着, 因此如果block中用到self时, 需要将其弱化, 通过__weak或者__unsafe_unretained.

//
//  ViewController.m
//  block用copy修饰
//
//  Created by LiuYihua on 2018/3/29.
//  Copyright © 2018年 liuyihua. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, copy) void(^myblock)(void);
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //1 __NSGlobalBlock__  全局block   存储在代码区(存储方法或者函数)
    void(^myBlock1)(void) = ^() {
        NSLog(@"我是老大");
    };

    NSLog(@"%@",myBlock1);


    //2 __NSStackBlock__  栈block  存储在栈区
    //block内部访问外部变量
    //block的本质是一个结构体
    int n = 5;
    void(^myBlock2)(void) = ^() {
        NSLog(@"我是老二%d", n);
    };
    NSLog(@"%@", myBlock2);

    
    //3 __NSMallocBlock__  堆block 存储在堆区  对栈block做一次copy操作
    void(^myBlock3)(void) = ^() {
        NSLog(@"我是老二%d", n);
    };
    NSLog(@"%@", [myBlock3 copy]);


    /*

     由以上三个例子可以看出当block没有访问外界的变量时,是存储在代码区,
     当block访问外界变量时时存储在栈区, 而此时的block出了作用域就会被释放
     以下示例:
     */
    [self test];//当此代码结束时,test函数中的所有存储在栈区的变量都会被系统释放, 因此如果属性的block是用assign修饰时  当再次访问时就会出现野指针访问.
    self.myblock();

}

- (void)test {
    int n = 5;
    [self setMyblock:^{
        NSLog(@"%d",n);
    }];
    NSLog(@"test--%@",self.myblock);

}

@end

打印结果:


打印结果

参考文章:
Block为什么用copy修饰

相关文章

  • iOS高级面试

    1、修饰属性有哪几个?追问 为什么用copy?weak对象为nil的底层原理?2、block是什么?block有几...

  • 2019 iOS面试题大全---全方面剖析面试(下)

    1、iOS block 的原理,block 的属性修饰词为什么用 copy,使用 block 时有哪些要注意的? ...

  • block学习

    block为什么是用copy修饰 block属性的声明,首先需要用copy修饰符,因为只有copy后的block才...

  • OC中的copy

    1.所有被copy修饰的对象都会进行深copy吗? 答案:NO,例如block 全局block被copy修饰不会有...

  • Block简单使用

    block用copy修饰block里不能改变block外面的变量,如果需要改变必须在变量前面加__block 修饰...

  • Block为什么用copy修饰

    默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着,...

  • 为什么用 copy 修饰 block

    属性可以存储一个代码块。为了让它存活到定义的块的结束,必须使用 copy (block 最早在栈里面创建,使用 c...

  • 为什么用copy修饰block

    转: 简单来说,block就像一个函数指针,指向我们要使用的函数。 就和函数调用一样的,不管你在哪里写了这个blo...

  • Block为什么用copy修饰

    Block简介: block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那b...

  • block

    block为什么用copy修饰? 因为在MRC下block默认是存储在栈上的,栈上的内存很可能随时会被释放,blo...

网友评论

    本文标题:Block为什么用copy修饰

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