重点block

//  main.m

//  block探索

//

//  Created by 殷婷婷 on 15-6-6.

//  Copyright (c) 2015年 lanou. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

 

        

//====================普通变量==============================

        

//普通的局部变量,block只会拿到它初始的值(block定义那一刻),不能跟踪值的改变

//        int a = 10;

//        

//        a = 20;

//        void (^block)() = ^{

//                             NSLog(@"%d",a);//block会在定义那一刻直接拿到外部局部变量的值,以后都不会改变,这个值相当于是个常量了,所以打印20

//                           };

//        

//        a = 100;

//        

//        block();

//======================被__block修饰的变量======================

        

     __block int a = 10;

        

        a = 20;

        void (^block)() = ^{

            NSLog(@"%d",a);//block能够一直引用被__block修饰的变量,所以打印100

        };

        

block本质上是指向结构体的指针,之所以可以改变变量的值,因为它传的是地址。        a = 100;

        

        block();

 

        

    }

    

//===================被static修饰的变量========================

    

    static int a = 10;

    

    a = 20;

    void (^block)() = ^{

        NSLog(@"%d",a);//block能够一直引用被static修饰的变量,所以打印100

    };

    

    a = 100;

    

    block();

    

//===================全局变量================================

//    int a = 10;这个a定义在函数外

    

    a = 20;

    void (^block)() = ^{

        NSLog(@"%d",a);//block能够一直引用全局变量,所以打印100

    };

    

    a = 100;

    

    block();

 

    

}

 

block究竟放在什么地方?既放在堆中,又放在栈中。默认情况下,任何block都是在栈,随时可能会被回收。对block进行一次copy操作,block就会放在堆中

 两种写法

[block copy].....Block_copy(block):ARC环境不可用。。。。

retain只是计数器加1,不会将block从栈中搬到堆中

 

__unsafe_unretained相当于_weak

posted @ 2015-06-06 16:20  Emyin  阅读(218)  评论(0编辑  收藏  举报