// 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;
}
|
|