ios Bloack浅析(补充)

ios Bloack浅析(补充一)

关于block补充以下几点:
1.关于在property中使用block
因为block特性的原因,如果对blcok进行强引用或者copy都会把blcok从stack拷贝到堆中,所以在最新的遍其器ARC模式下使用Strong来引用,其最终效果是和copy一样的
2.关于block对外部变量的捕获
捕获变量是从block实现的时候开始捕获,并非调用
3.如果想把blcok定义到堆中 应该如何写代码
1)

void (^  StrongBlock)(void) = ^ {
        NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)self));
    };
    StrongBlock();
2)
  typedef void(^strongBlock)(void);
    @property (nonatomic ,copy) strongBlock strong;//ARC此处copy或者strong都可
    self.strong = ^ {
        NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)self));
    };
    self.strong();

4.关于__weak和 __block
一、ARC模式下的 对象
__weak typeof(self) weakSelf = self;//不会产生循环引用
__block typeof(self) blockSelf = self;//会产生循环引用
二、ARC模式下的 基础数据类型
block 试用外部变量 一种为参数传值 一种为直接使用
注:此处用weak的用法为错误用法,为方便对比才这么写,weak应该用在指针类型,不能用在基础数据非指针类型,此处会报警告,非error可以正常运行
1)传值

 int a = 0;
    __weak int b = 1;
    __block int c = 2;
    void (^ strongBlock)(int, int, int) = ^(int firt , int second , int third) {
        firt++;
        second++;
        third++;
        NSLog(@"a=%d-->b=%d-->c=%d",firt,second,third);
        NSLog(@"a=%d-->b=%d-->c=%d",a,b,c);
    };
    strongBlock(a,b,c);
    NSLog(@"a=%d-->b=%d-->c=%d",a,b,c);
值的传递  不论外部定义的是否使用了__block在内部对传入的值改变都不会影响外部变量
2)直接使用
int a = 0;
__weak int b = 1;
__block int c = 2;
void (^ strongBlock)(void) = ^ {
    /*
    a = ++;
    b = ++;
    */
    c++;
};

strongBlock(a,b,c);
NSLog(@“a=%d–>b=%d–>c=%d”,a,b,c);
此处,对a和b赋值,会直接报错error:
Variable is not assignable (missing __block type specifier)
“变量不可赋值”
注视block内部的a b的赋值代码后可以正常运行,运行结果 最后打印中c的值会变为3
所以,此处weak无用,__blcok让block内部可以直接修改外部变量
此处再提一个不用__block直接传递指针修改变量的方法:

int a = 0;
void (^ strongBlock)(int *) = ^(int * firt) {
    (* firt)  = 999;
};
strongBlock(&a);
NSLog(@"a=%d",a);

暂时先这些吧,有时间再补充剩下的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值