OC中Block相关问题总结

本文深入探讨了Objective-C中Block的使用技巧与注意事项,包括解决Block中相互引用的问题、Block内外变量的正确处理方式、MRR环境下Block的内存管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Block中相互引用问题解决方案:
__weakThirdViewController*weakSelf =self;
__weaktypeof(self) weakSelf = self;

2.为什么Block使用copy而不用strong
@property(nonatomic,copy)void(^block)();
或者set方法中_block= [blockcopy];
因为block变量默认是声明为栈变量(创建时在栈区分配的内存),为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。
使用完[blockcopy]后打印结果如下:
<__NSStackBlock__: 0x7fff5fbff728> ,
<__NSMallocBlock__: 0x100115b10>

3.block外的局部遍历可以直接使用 但是其实是block自己复制了一个常量在使用 此时这个常量不能修改值 会报错
NSIntegertheNum =10;
void (^myBlock)() = ^{
//如果在block中使用block之外的局部变量,block会将局部变量的值进行保留 
NSLog(@"%ld",theNum);
};

4.在block中想修改外部变量的值 直接修改会报错 要使用__block修饰
__blockintt =20;//告诉编译器Block会修改这个值
void(^Change)(void) = ^(void){
t =50;
};

5.MRR情况下使用Block的内存管理:
使用以下函数 retain realease
Block_copy(self.block);
Block_release(self.block);

6.block导致的相互引用中就算是(使用self的_index属性)或者(调用self的方法)也会导致循环引用 如果强行用 可以使用强指针再指向这个弱指针











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值