码迷,mamicode.com
首页 > 其他好文 > 详细

OC 中的block存储位置

时间:2015-04-10 01:08:09      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

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

详细介绍:

情况1:代码区

    不访问处于栈区的变量(例如局部变量),且不访问处于堆区的变量(例如alloc创建的对象)。也就是说访问全局变量也可以。

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

 

情况2:堆区

    如果访问了处于栈区的变量(例如局部变量),或处于堆区的变量(例如alloc创建的对象)。都会存放在堆区

/**
  访问局部变量
 */
int main(int argc, char * argv[]) {
    int iVar = 10;
    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:

        1 copy可变变量:在赋值指针的同时也会复制指针指向的内存区域。深拷贝

        2 copy不可变变量:等同于strong,还是浅拷贝

    因为block是一段代码,即不可变的,所以并不会深拷贝

 

OC 中的block存储位置

标签:

原文地址:http://www.cnblogs.com/mddblog/p/4413166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!