IOS中Block总结

1.block分为 

      (1).NSGlobalBlock:类似函数,位于text段;(没有引用外部变量的block,NSGlobalBlock的copy和retain是无效)

      (2).NSStackBlock:位于栈内存,函数返回后Block将无效;(引用外部的block,局部的NSStackBlock返回时在MRC下报错,在ARC下会自动加上copy)

      (3).NSMallocBlock:位于堆内存。(copy后的block都是NSMallocBlock,增加引用计数)

二. block在ARC和非ARC下__block作用

    在MRC下 __block不会retain变量,只是让block不占有变量可以避免循环引用,类似ARC下的__weak

    在ARC下 __block修饰变量,会retain变量,避免不了循环引用。要用__weak避免循环引用。

    用__block时相当于提升了变量的作用域,相当于是static和全局变量作用。

三.block其他

   copy块时,会把block中用引用的外部加__block修饰int float变量copy到栈上,用到object会复制到堆上,当多次copy次block时变量只copy一次。(没加__block的变量会作为实参传到block底部函数中,此变量非彼变量,函数返回后block内变量仍可用)

    block外部用__weak避免循环引用在block内用__strong修饰可以在block对变量强引用,避免了变量提前释放。

    block声明时必须用copy,这样声明的block属性是NSMallocBlock在dealloc销毁,其他属性声明时相当于block是在栈上声明,局部使用完就会销毁block,里面的对象也会被释放。


四.block示例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是...
    qui丶MyLove阅读 3,169评论 0 0
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,400评论 30 472
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 9,154评论 0 23
  • Block作为C语言的扩展,和其他语言的闭包或lambda表达式是一回事。Block不支持ARC,必须自己管理内存...
    AYuan_阅读 2,967评论 0 0
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 6,120评论 0 12

友情链接更多精彩内容