iOSのblock静的グローバルローカル変数block変数、およびオブジェクト、詳細について!
16429 ワード
// , block , , ,
1 #import
2 int gNum = 100;
3 int main(int argc, const char * argv[]) {
4 @autoreleasepool {
5 static int sNum = 100;
6 __block int bNum = 100;
7 int lNum = 100;
8 int (^sum)(int, int) = ^(int a, int b) {
9 NSLog(@"%d %d %d %d",sNum,gNum,lNum,bNum);
10 sNum++;
11 bNum++;
12 gNum++;
13 return a + b + lNum + gNum + sNum + bNum ;
14 };
15 sNum = 1;
16 bNum = 1;
17 gNum = 1;
18 lNum = 1;
19
20 NSLog(@"%d",sum(1,2));
21 NSLog(@"%d",sNum);
22 NSLog(@"%d",bNum);
23 NSLog(@"%d",gNum);
24 NSLog(@"%d",lNum);
25
26 }
27 return 0;
28 }
印刷結果
1 12:57:09.984 xxx[10180:2208151] 109
2 12:57:09.984 xxx[10180:2208151] 2
3 12:57:09.984 xxx[10180:2208151] 2
4 12:57:09.984 xxx[10180:2208151] 2
5 12:57:09.984 xxx[10180:2208151] 1
Blockは実は2つの部分の内容を含む.Blockが実行するコードは、コンパイル時に生成されたものです. 2.Blockの実行に必要なすべての変数値を含むデータ構造.Blockは、役割ドメイン付近の変数の値を使用してスナップショットをスタックにコピーします.Blockと関数のもう一つの違いは、BlockはObjcのようなオブジェクトであり、自動リリースプール管理メモリ3 Blockを使用して外部変数へのアクセス管理基本データ型1、局所変数局所自動変数、Blockでは読み取り専用である.Block定義時のcopy変数の値は、Blockで定数として使用されるため、変数の値がBlockの外で変化しても、Blockでの値には影響しません.2,static修飾子の静的変数またはグローバル変数グローバル変数グローバル変数貨物静的変数はメモリ内のアドレスが固定されているため、Blockは変更量値を読み出すときにその存在するメモリから直接読み出し、daodeを取得するのは定義時のcopyの定数ではなく最新値である. 3,__block修飾変数block変数ブロック修飾変数をBlock変数と呼ぶ.基本型のBlock変数などの小雨グローバル変数や静的変数.Blockの使用は関数ポインタに似ていますが、関数と最大の違いは、Blockが関数以外、文法作用ドメイン内の外部変数の値にアクセスできることです.
二、オブジェクトタイプ
//ローカルオブジェクト
- (void)localObjTest
{
UILabel *localObj = [[UILabel alloc]init];
NSLog(@"localObj adress --%p", & localObj);
void (^test)() = ^{
NSLog(@"localObj adress --%p", & localObj);
NSLog(@"localObj --%@",localObj);
};
localObj = nil;
test();
}
印刷結果:
2018-03-17 13:44:25.848 test1[1332:79267] localObj adress-- 0xbff7ced4
2018-03-17 13:44:25.848 test1[1332:79267] localObj adress-- 0x7b63f8b4
2018-03-17 13:44:25.848 test1[1332:79267] localObj --0x7c8337a0; frame = (0 0; 0 0);
//
- (void)staticObjTest
{
static UILabel *staticObj ;
staticObj = [[UILabel alloc]init];
NSLog(@"staticObj adress --%p", & staticObj);
void (^test)() = ^{
NSLog(@"staticObj adress --%p", & staticObj);
NSLog(@"staticObj --%@",staticObj);
};
staticObj = nil;
test();
}
印刷結果:
2018-03-17 13:44:25.917 test1[1332:79267] staticObjadress -- 0x85a48
2018-03-17 13:44:25.917 test1[1332:79267] staticObjadress -- 0x85a48
2018-03-17 13:44:25.917 test1[1332:79267] staticObj --(null)
//
- (void)globalObjTest
{
globalObj = [[UILabel alloc]init];
NSLog(@"staticObj adress --%p", & globalObj);
void (^test)() = ^{
NSLog(@"globalObj adress --%p", & globalObj);
NSLog(@"globalObj --%@",globalObj);
};
globalObj = nil;
test();
}
印刷結果:
2018-03-17 13:44:25.917 test1[1332:79267] staticObjadress -- 0x85a4c
2018-03-17 13:44:25.917 test1[1332:79267] globalObjadress -- 0x85a4c
2018-03-17 13:44:25.917 test1[1332:79267] globalObj --(null)
//block
- (void)blockObjTest
{
__block UILabel *blockObj = [[UILabel alloc]init];
NSLog(@"blockObj adress --%p", & blockObj);
void (^test)() = ^{
NSLog(@"blockObj adress --%p", & blockObj);
NSLog(@"blockObj --%@",blockObj);
};
blockObj = nil;
test();
}
印刷結果:
2018-03-17 13:44:25.917 test1[1332:79267] blockObj adress-- 0xbff7ced0
2018-03-17 13:44:25.918 test1[1332:79267] blockObj adress-- 0x7c835598
2018-03-17 13:44:25.918 test1[1332:79267] blockObj --(null)
まとめ:テスト結果から
*静的オブジェクト変数およびグローバルオブジェクト変数の場合、アドレスは固定されません.
*ローカル(ローカル)オブジェクト変数については、blockを定義する際に同様に(ポインタ)変数がコピーされ、blockでは(ポインタ)定数として使用され、外部の影響を受けません.
*blockオブジェクト変数についても、blockを定義する際に同じように変数をスタックからスタックに移行したことは、先ほどの方法でも同様に検証できます.したがってblock変数は外部の影響を受け,出力結果が空になる.
転載先:https://www.cnblogs.com/henusyj-1314/p/8589365.html