A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一马当先 中级黑马   /  2016-3-19 21:46  /  779 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//  main.m
//  3-【掌握】block访问外部变量
//
//  Created by IOSBasic_7 on 15/10/22.
//  Copyright © 2015年 itheima. All rights reserved.
//

#import <Foundation/Foundation.h>
void test1(){

    int m = 10; //m是一个局部变量,存储内存的栈区
    NSLog(@"m = %d,addr = %p",m,&m);
   
    //定义一个无参无返回值的block变量
    void (^myblock)() = ^{
        
      
        //0x100102970 堆区
        NSLog(@"inBlock m = %d,addr = %p",m,&m);
        
    }; //一定要有分号
   
   
    myblock();
    //给m重新赋值
    m = 100;
    NSLog(@"m = %d,addr = %p",m,&m);

}

void test2(){

    int m = 10; //m是一个局部变量,存储内存的栈区
    NSLog(@"m = %d,addr = %p",m,&m);
   
    //定义一个无参无返回值的block变量
    void (^myblock)() = ^{
        
        int m = 100;  //此时m是和外部同名的一个变量
        //并且此处的m会屏蔽掉外部变量的作用域
        //0x100102970 堆区
        NSLog(@"inBlock m = %d,addr = %p",m,&m);
        
    }; //一定要有分号
   
   
    myblock();
    //给m重新赋值
    m = 100;
    NSLog(@"m = %d,addr = %p",m,&m);

}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        __block int m = 10; //m是一个局部变量,存储内存的栈区
        NSLog(@"m = %d,addr = %p",m,&m);
        
        //定义一个无参无返回值的block变量
        void (^myblock)() = ^{
        
            //默认情况下不可以在block内部对外部的变量进行修改
            //1) 外部的变量,以const的方式拷贝过来的,const方式不能修改
            //2) 保证程序的可读性(一般在函数\或者代码块内部不对外部变量进行操作)
            // 如果非要对外部变量进行修改,那么必须在外部变量的前面加上 __block
            // __block 是一个标识,表示我们的外部外部变量,可以在block内部进行修改
            // 让编译器,忽略检查.同时,block代码块之后,再使用的m的值,都是堆区的m
            m = 10000;
            //0x100102970 堆区
            NSLog(@"inBlock m = %d,addr = %p",m,&m);
        
        }; //一定要有分号
        
        
        myblock();
        //给m重新赋值
        //m = 100;
        NSLog(@"m = %d,addr = %p",m,&m);
        
    }
    return 0;
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马