// 棧區,堆區,BSS,數據區,代碼區spa
#import <Foundation/Foundation.h>.net
int main(int argc, const char * argv[]) {orm
@autoreleasepool {內存
// 第一種和第二種get
//int i = 10; // 棧區編譯器
// 第三種 __block修飾符告訴編譯器,i的值能夠在block內部修改(忽略檢查)io
// 注意:一旦使用__block修飾以後,之後使用的都是堆區的變量。編譯
__block int i = 10;import
NSLog(@"i = %d, i addr = %p", i,&i); // i = 10, i addr = 0x7fff5fbff77c變量
// 定義一個無參無返回值的block
// 注意在block代碼塊的內部使用外部變量,
// 1)在block定義的時候,把block外部的變量的值copy到了內存的堆區
// 2)拷貝的過程當中使用了const(以const的形式把外部變量作了一個copy)
void (^myblock)() = ^{
// 第一種
// i = 100; 會報錯
// block 代碼塊
// 1)可否使用變量i
//NSLog(@"i = %d", i); // i = 10
// 2)變量i存儲在哪一個內存區域
//NSLog(@"i addr = %p",&i); // addr = 0x100102750 堆區
// 第二種
//int i = 100; // 這是定義一個局部變量 棧區
//NSLog(@"i = %d", i); // i = 100
//NSLog(@"i addr = %p",&i); // addr = 0x7fff5fbff72c
// 第三種 必定要修改i
i = 100;
NSLog(@"i = %d, i addr = %p", i,&i); //i = 100, i addr = 0x1004004b8
};
myblock();
i = 20;
NSLog(@"i = %d, i addr = %p", i,&i); //i = 20, i addr = 0x7fff5fbff77c
// i = 20, i addr = 0x1004004b8 第三種
}
return 0;
}