block的一些很基础的玩意

简介

虽然工作了很长时间了,之前也是从一个不相关的职业改行到iOS的开发;;一个人开发的过程很没意思(没人和你交流提升自然很慢)....写过的程序用起来还不错,满足了用户的需求,但是当被问及一些类似基础面试题,一些原理以及一些第三方的基本实现原理的时候,还是萌萌哒(主要是蒙圈了)

所以我决定"从新","从低"的学习iOS...

本文主要参考Cooper's Blog的文章,自己模仿写的,估计有很多的不足之处,希望大家可以指教, 想看深一层的请点击大神连接查看,这篇文章里说的都是我个人理解(偏于大白话),写这个主要是想让自己加深印象

这文章中提及的都是在ARC环境下测试的

1.Block在内存中的位置

  • 第一种类型
    屏幕快照 2015-08-31 下午7.21.14.png

    上面的代码打印出来的值是 <NSGlobalBlock: 0x100871090>
    由打印结果可以看出来类型是:NSGlobalBlock,全局block,存储在代码区
  • 第二种类型

屏幕快照 2015-08-31 下午7.42.01.png

打印结果: <NSMallocBlock: 0x7f8e72f0f410>
由打印结果可以看出来类型是: _NSMallocBlock ,堆block 存储在堆区

总结以上2中block的区别: 简单的说就是看block中是否用到了block之外的变量,第一种的是没有用到外部的变量,第二种的时候用到了block外部的局部变量,我们在外部打印的指向temp指针的地址和在block内部打印的结果不一样,这也许就是说的需要将局部变量copy一下,这就是区别所在.

  • 第三种类型
    我测试的环境是ARC,当你把block定义成一个属性用weak/assign来修饰的时候
    1.如果你使用了block之外的局部变量,则此时的block是<NSStackBlock: 0x7fff5a9e9a50>
    2.如果没用使用外部的局部变量,则此时的是***<NSGlobalBlock: 0x1095c6080>****

2.block循坏引用

  • 在MRC下,为了避免循环引用的问题我们需要用__block
  • 在ARC下,由于__block取变量的时候一样会被block retain,所以在ARC情况下应该使用__weak(弱引用)
  • 当block声明为属性的时候,应该使用copy来修饰,因为这样block才能将block拷贝到堆上,要不就跑栈上了,栈区就不是你控制的了啊

3.__weak的使用

参考文章__weak和__block的区别
在Block中使用成员变量,retain的不是这个变量,而会retain self
在ARC下为了防止循环引用用__weak

屏幕快照 2015-09-01 下午5.02.52.png

如果我们正在执行block中,这时如果是外部把model = nil 那么block中的weakModel的值也会被设置成nil,这也许就违背了使用的意图
解决方法是:如上图所示 __strong接受一些weakmodel,这样就可以避免

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

相关阅读更多精彩内容

  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 13,341评论 10 69
  • Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是...
    qui丶MyLove阅读 3,192评论 0 0
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 9,172评论 0 23
  • 一、Objective-C发展史 Objective-C从1983年诞生,已经走过了30多年的历程。随着时间的推移...
    没事蹦蹦阅读 11,135评论 12 34
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,419评论 30 472

友情链接更多精彩内容