本文主要是介绍ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://www.dahuangphone.com/dispbbs.asp?boardid=8&replyID=213&ID=85&skin=1
ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题
由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃, 在非ARC情况下, 我们要返回一个Block ,需要 [Block copy];
在ARC下, 以下几种情况, Block会自动被从栈复制到堆:
1.被执行copy方法
2.作为方法返回值
3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时
4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候.
对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中实用的对象:
__block id blockSelf=self;
self.blk=^{
NSLog( @"%@" ,blockSelf); //在非ARC下对于栈上的_block对象, Block不会对其复制, 仅仅使用, 不会增加引用计数.
};
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中实用的对象:
__weak id weakSelf=self;
self.blk=^{
NSLog( @"%@" ,weakSelf);
};
如果要在ARC下, 为了防止循环引用, 使用__block来修饰在Block中实用的对象,仍然会被retain, 所以需要多做一些设置
__block id blockSelf=self;
self.blk=^{
NSLog( @"%@" ,blockSelf);
blockSelf=nil;
};
并且一定要运行一次blk();
这样就使blk断开了与blockSelf的持有关系, 这是使用__block是为了允许在blk修改其值.
这么多好处是可以自己控制对self的持有时间.
这篇关于ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!