ios-block作为属性的时候为什么用copy

当我们block的属性用copy的时候就会把栈的block变成了堆的block。如果我们block用assign来修饰的话就是栈的block,一调用就会出错比如说这样的话一调用就会出错。因为我们是在test方法中赋值的,当方法执行完成之后,block就被释放了,因为它是栈block,如果我们把assign改成了copy就不会报错了。由栈block变成了堆的block.

@property (nonatomic ,assign)void(^myblock)();
- (void)viewDidLoad {
    [super viewDidLoad];
    [self test];
    self.myblock();

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


我们在test方法里面对block进行了赋值,但是到了外界,我们去调用我们的block的时候,程序及崩溃了。


block的几种形式

 //全局的block  __NSGlobalBlock__
    void (^test)()=^{
        NSLog(@"jjjj");
    };
    NSLog(@"%@",test);
   //第二种的block 如果访问了外部处于栈区的变量(比如局部变量),或处于堆区的变量。都会存放在堆区,如果访问的是内部创建的变量还是存储在全局区
//在ARC中做了特殊的处理,自动的做了copy操作,所以为__NSMallocBlock__在MRC中是__NSStackBlock__ 栈block
    int number=5;
    void (^test)()=^{
        NSLog(@"jjjj %d",number);
    };
    NSLog(@"%@",test);
    //第三种的block是__NSMallocBlock__
        int number=5;
        void (^test)()=^{
            NSLog(@"jjjj %d",number);
        };
        NSLog(@"%@",[test copy]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值