iOS笔记 Block和内存管理

1.在块声明的范围里,所有变量都可以被它使用,不过不能修改。想要修改怎么办?可以在变量声明是加上__block。
2.如果块中使用的变量是对象类型,那么就会自动保留它。系统在释放这个块的时候,也会一并释放。
3.如果块定义在Ojective-C类的实例方法中,那么除了可以访问类的所有实例变量之外,还可以使用self变量。
块总能修改实例变量,并不需要在声明时加__block。
4.在块中使用实例变量如(_name),_name <=> self->_name,块也会保留self,可能到致循环应用
5.块默认是分配在栈上的,也就是说块只在定义它的范围里有效。
void(^block)();
if(/**some condition*/)
{
	block = ^{NSLog(@"Block A")};
}
else
{
	block = ^{NSLog(@"Block B")};
}
block();
定义在if及else语句中的两个块都分配在栈内存中。出了其作用域以后,栈中的内存可能被编译器覆盖掉。再去调用
这个块就可能引发一些产生一些奇怪的问题。要避免这个问题,可以将block复制到堆上。
void(^block)();
if(/**some condition*/)
{
	block = [^{NSLog(@"Block A")} copy];
}
else
{
	block = [^{NSLog(@"Block B")} copy];
}
block();


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值