快捷搜索:

以下情况均在ARC情况下

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

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

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

情况1:代码区

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

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

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

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

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

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

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

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

本文由澳门新葡萄京8455官网发布于澳门新葡萄京8455官网,转载请注明出处:以下情况均在ARC情况下

您可能还会对下面的文章感兴趣: