
- (voID)method { Nsstring *string= [Nsstring string]; //will be autoreleased dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,0),^{ //very very lengthy operation... NSLog(@"%@",string); //is it safe? });} 我想知道这是否正确,因为我认为我应该在块执行之前保留字符串:实际上我担心事件循环结束并在块中使用字符串之前发送字符串自动释放消息.这会使程序崩溃.
我对吗?我应该向字符串发送保留和释放消息,还是这是正确的实现?
提前致谢!
I’m wondering if this is correct,because I think I should have retained string before the block execution: in fact I fear that the event loop finishes and sends string an autorelease message before using string in the block.
不要害怕:
块捕获周围方法/函数的范围,因为它自动保留块内部使用的任何对象变量.当你在块中使用self时要注意这一点,因为这可能会极大地影响对象的生命周期!
这个规则有一个例外,那就是声明为的变量
__block SomeObjectPointerType variablename
更新
因为对这个答案有一个新的评论,我应该补充说,随着ARC的引入,事情发生了一些变化:
在ARC下,所有对象变量都默认为__strong,这也适用于标有__block的变量.如果要避免在块中强烈捕获变量,则应定义__weak的局部变量.
结束更新
如果你想了解更多关于积木的信息,bbum在WWDC 2010上发布了一个名为Introducing Blocks and Grand Central Dispatch on iPhone(iTunes U链接)的优秀会议.
“阻止详细信息”部分从11:30开始.
总结以上是内存溢出为你收集整理的objective-c – 多线程和自动释放池全部内容,希望文章能够帮你解决objective-c – 多线程和自动释放池所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)