美文网首页
block的一些很基础的玩意

block的一些很基础的玩意

作者: captainGao | 来源:发表于2015-09-01 17:41 被阅读120次

简介

虽然工作了很长时间了,之前也是从一个不相关的职业改行到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,这样就可以避免

相关文章

  • block的一些很基础的玩意

    简介 虽然工作了很长时间了,之前也是从一个不相关的职业改行到iOS的开发;;一个人开发的过程很没意思(没人和你交流...

  • block详解<1>: block到底是什么

    block到底是个啥玩意? 先来看一个最简单的block的定义 没错,这个block非常简单:没有返回值,没有参数...

  • inline-block元素间间距的问题

    描述:一个很基础的小问题,两个相邻的inline-block元素中间会有间隙 原因:inline-block水平呈...

  • iOS Block 部分一

    主要讲解 Block 的底层实现原理; Block部分一Block部分二Block部分三Block知识点总结 基础...

  • iOS - block基本使用

    block的概念 OC在C的基础之上新增了一些数据类型。 BOOLBoolenclassnilSELidblock...

  • Block相关(二)

    前言,在上篇文章Block相关(一),中介绍了Block相关的基础知识,包括Block介绍、基础语法、使用情况等。...

  • OC基础-Block(2)

    OC基础-Block(2)Block的变量捕获为了保证block内部能够正常访问外部的变量,block有个变量捕获...

  • 详细的探讨一下Block(讨论篇、基础篇、实质篇)

    章节目录 关于Block的讨论篇 Block的基础篇 Block的实质篇 讨论篇: 为什么要看Block? 为了更...

  • Block基础+实践

    一.目录 Block的定义. 一. Block的基础 1. Block的定义? Block是一种特殊的数据类型,它...

  • BLOCK的页面传值

    (1)Block的基础语法: 1>Block的声明 void (^returnBlock)(NSString*te...

网友评论

      本文标题:block的一些很基础的玩意

      本文链接:https://www.haomeiwen.com/subject/fixlcttx.html