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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© herobin 中级黑马   /  2016-1-10 20:38  /  654 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//
//  main.m
//  block访问外部变量
//
//  Created by herobin on 16/1/5.
//  Copyright © 2016年 herobin. All rights reserved.
/*

注意:
    1 静态变量 和 全局变量,在加和不加 __block 都会直接引用变量地址,也就意味着,可以修改变量的值

    2 常量变量(NSString *a = @"hello"; a为变量,@"hello"常量)  不加 __block类型,block会引用常量的地址(浅拷贝).    加__block类型,block会去引用常量变量(如:a变量,a =@"abc",可以任意修改a指向的内容)的地址

        如果不加__block 直接在block内部修改变量,会编译报错. block 内部改变量是 只读的.


*/

#import <Foundation/Foundation.h>

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

1 个回复

倒序浏览
顶一下!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马