一篇关于ios block内存管理的文章
2013-09-06 19:30
260 查看
http://www.xcodechina.com/forum.php?mod=viewthread&tid=115
排版总是乱,直接发个原文链接吧
http://jessex.me/cocoa/181.html
[align=left]本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。[/align]
[align=left]先定义一个block变量,作为后续的例子中使用:[/align]
?
1、block中引用外部变量
[align=left]block中可以直接使用外部的变量,比如[/align]
?
[align=left]那么实际上,在block生成的时候,是会把number当做是常量变量编码到block当中。可以看到,以下的代码,block中的number值是不会发生变化的:[/align]
?
[align=left]则输出的值为 1,而不是2。原因就是如上所说。[/align]
[align=left]如果要在block中尝试改变外部变量的值,则会报错的。对于这个问题的解决办法是引入__block标识符。将需要在block内部修改的变量标识为__block scope。更改后的代码如下:[/align]
?
[align=left]而这个时候,其实block外部的number和block内部的number指向了同一个值,回到刚才的在外部改变block的例子,它的输出结果将是2,而不是1。有兴趣的可以自己写一个例子试试。[/align]
2、block自身的内存管理
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
我在view did load中创建了一个block:
?
[align=left]并且在一个按钮的事件中调用了这个block:[/align]
?
此时我按了按钮之后就会导致程序崩溃,解决这个问题的方法就是在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上,那么就可以在其他地方使用这个block了~
修改代码如下:
?
[align=left]同理,特别需要注意的地方就是在把block放到集合类当中去的时候,如果直接把生成的block放入到集合类中,是无法在其他地方使用block,必须要对block进行copy。不过代码看上去相对奇怪一些:[/align]
?
3、循环引用
[align=left]这一点其实是在第一点的一个小的衍生。当在block内部使用成员变量的时候,比如[/align]
?
[align=left]在block创建中:[/align]
?
这里的_string相当于是self->_string;那么block是会对内部的对象进行一次retain。也就是说,self会被retain一次。当self释放的时候,需要block释放后才会对self进行释放,但是block的释放又需要等self的dealloc中才会释放。如此一来变形成了循环引用,导致内存泄露。
修改方案是新建一个__block scope的局部变量,并把self赋值给它,而在block内部则使用这个局部变量来进行取值。因为__block标记的变量是不会被自动retain的。
?
[align=left]先写到这里,基本是我在用block时候碰到的一些问题。需要更详细的解释,可以看看《Adanced Mac OS X Programming》这本书,推荐给大家。[/align]
排版总是乱,直接发个原文链接吧
http://jessex.me/cocoa/181.html
[align=left]本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理。[/align]
[align=left]先定义一个block变量,作为后续的例子中使用:[/align]
?
[align=left]block中可以直接使用外部的变量,比如[/align]
?
?
[align=left]如果要在block中尝试改变外部变量的值,则会报错的。对于这个问题的解决办法是引入__block标识符。将需要在block内部修改的变量标识为__block scope。更改后的代码如下:[/align]
?
2、block自身的内存管理
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
我在view did load中创建了一个block:
?
?
修改代码如下:
?
?
[align=left]这一点其实是在第一点的一个小的衍生。当在block内部使用成员变量的时候,比如[/align]
?
?
修改方案是新建一个__block scope的局部变量,并把self赋值给它,而在block内部则使用这个局部变量来进行取值。因为__block标记的变量是不会被自动retain的。
?
相关文章推荐
- 转载一篇关于ios block内存管理的文章
- 复杂的世界里,一篇关于iOS 10开发的文章就够了
- 复杂的世界里,一篇关于iOS 10开发的文章就够了
- 转载一篇关于ios静态库的文章
- 转载一篇关于ios copy的文章
- 一篇文章让你看懂IOS中的block为何再也不需要WeakSelf弱引用
- iOS block的用法------相当不错的一篇文章
- iOS关于block的内存管理
- 不想升级,iOS系统自动更新可彻底关闭! 2016-05-23 16:38 更新/自动/on 昨天笔者发布了一篇关于iOS系统总提醒更新,到底要不要升级的文章,不少读者在微信上留言给笔者, iPhon
- 一篇关于IOS适配很好的文章
- 一篇关于arc下内存管理的老文章,包括各种冷门修饰符(关于内存),写的较好,mark
- 一篇关于arc下内存管理的老文章,包含各种冷门修饰符(关于内存),写的较好,mark
- 转载的一篇关于iOS里多线程NSThread/NSOperation/GCD的文章
- iOS block的用法------相当不错的一篇文章
- iOS 关于信号量的文章
- 转关于Power Law 的一篇文章:保存一下
- 关于lod的一篇经典文章
- 关于ios的arc,不错的一篇,转过来.....
- 关于GtkTreeView和 MVC的一篇好文章 入木三分
- 关于code review 很好的一篇文章,收藏过来时刻警示自己