iOS中的block块存储位置

作者: manofit | 来源:发表于2016-10-10 20:56 被阅读939次

有了上面一篇《iOS开发中的内存分配与分区》的说明,现在可以对iOS中block的存储位置做一下说明了。

这里说明下,以下情况均在ARC情况下

一、block块的存储位置(block块入口地址):
可能存放在2个地方:代码区、堆区(程序分5个区,还有常量区、全局区和栈区),对于MRC情况下代码还可能存在栈区。
详细介绍:

情况1:代码区

/**
  没有访问任何变量
 */
int main(int argc, char * argv[]) {
    void (^block)(void) = ^{
        NSLog(@"===");
    };
    block();
}

情况2:堆区
如果访问了处于栈区的变量(例如局部变量),或处于堆区的变量(例如alloc创建的对象)。都会存放在堆区。(实际是放在栈区,然后ARC情况下自动又拷贝到堆区)。

/**
  访问了全局(静态)变量
 */
int  iVar = 10;
int main(int argc, char * argv[]) {
    void (^block)(void) = ^{
        NSLog(@"===%d",iVar);
    };
    block();
}

二、代码存放在堆区时,就需要特别注意,因为堆区不像代码区不变化,堆区是不断变化的(不断创建销毁)。因此代码有可能会被销毁(当没有强指针指向时),如果这时再访问此段代码则会程序崩溃。因此,对于这种情况,我们在定义一个block属性时应指定为strong,或copy。

@property (nonatomic, strong) void (^myBlock)(void); // 这样就有强指针指向它
@property (nonatomic, copy)  void (^myBlock)(void);  // 并不会在堆区copy一份,原因见 三

而对于第一种情况(代码存在代码区),使用strong,copy(不会复制一份到堆区)也可以。因此定义block时最好指定为strong(推荐)或copy。

三、指定为copy后是否会拷贝一份呢?(或者说是浅拷贝还是深拷贝)

  • copy可变变量:在赋值指针的同时也会复制指针指向的内存区域。深拷贝,例如NSMutableString对象。
  • copy不可变变量:等同于strong,还是浅拷贝,例如NSString对象。
    因为block是一段代码,即不可变的,所以并不会深拷贝。

相关文章

  • iOS中的block块存储位置

    有了上面一篇《iOS开发中的内存分配与分区》的说明,现在可以对iOS中block的存储位置做一下说明了。 这里说明...

  • iOS中的block块存储位置

    block块根据情况有两种可能的存储位置,一种存在代码区,一种存在堆区。 1、如果block块没有访问处于栈区的变...

  • IOS基础Block

    参考: iOS中block的使用、实现底层、循环引用、存储位置 一:Block的使用格式和用途 1,声明和定义格式...

  • block介绍内存管理修饰

    block块存储位置 block块根据情况有两种可能的存储位置,一种存在代码区,一种存在堆区。 1、如果block...

  • iOS中block块的存储位置&内存管理

    引 block是iOS开发中一种使用方便的代码块,但是在使用过程中也很容易不小心就造成问题,本文讲解其存储位置所决...

  • 问题:根据Block在内存中的位置谈谈Block

    根据Block在内存中的位置分为三种: 全局Block(_NSConcreteGlobalBlock)----存储...

  • iOS Block实现原理

    系列文章:iOS Block概念、语法及基本使用iOS Block __block说明符iOS Block存储域及...

  • iOS-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • iOS Block __block说明符

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block存储域及循环引用 上一...

  • iOS之Block

    参考文: 【简书】一篇文章看懂iOS代码块Block 【简书】iOS block中weakSelf和strongS...

网友评论

    本文标题:iOS中的block块存储位置

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