
這道題目,很多人會認為6,但是答案是3, 其實這邊和block關(guān)系并不大,主要還是num++和++num之間的差別,C語言里的基礎(chǔ),num++是返回后自增,而++num是自增后返回。Ok,這不重要,我把這道題目發(fā)群里后,大家開始了一波討論,首先,有人提出,如果把num用__block修飾,那輸出肯定是6了,

But,輸出依舊是3,那人懵逼了,仔細一想,應該這么改:

這樣的話,結(jié)果就不一樣了,很顯然,這涉及到block的一些知識。
一:Block的分類
1.NSStackBlock:棧block
2.NSMallocBlock:堆block
3.NSGlobalBlock:全局block
二:Block對外界變量的獲取
1.基本數(shù)據(jù)類型:局部變量
block會拷貝該變量的常量使用,外界修改的值不會影響block內(nèi)部,并且block內(nèi)部不能對其修改。
block內(nèi)部修改外界變量的值會error,這個歌時候可以在前面加上__block修飾,這個變量相當于全局變量和靜態(tài)變量。
int a = 0;
void (^block1)() = ^ {
// a++ 直接修改a會報錯
NSLog(@"a = %d",a);
};
a++;
block1(); //輸出結(jié)果 a = 0;
__block int b = 0;
void (^block2) () = ^ {
NSLog(@"block print b = %d",b); // 輸出結(jié)果 b = 0;
b = 2;
};
block2();
NSLog(@"out print b = %d",b); //輸出結(jié)果 b = 2;
2.基本數(shù)據(jù)類型成員變量(實例變量),靜態(tài)變量,全局變量
block直接訪問變量地址,在block內(nèi)部可以修改變量的值,并且變量被改變后,block內(nèi)部也會隨著改變。
self.num = 1;
self.num ++;
void (^block3) () = ^ {
self.num++;
};
block3();
NSLog(@"%d",self.num);//輸出結(jié)果為 3
3.指針類型: 成員變量(實例變量),靜態(tài)變量,全局變量
block會復制一份指針并強引用指針所指對象,且內(nèi)部不能修改指針的指向,但是可以修改指針所指向?qū)ο蟮闹担?/p>
static NSString *staticStr = @"abc";
void (^block5) () = ^{
NSLog(@"staticStr = %@",staticStr);
staticStr = @"def";
NSLog(@"staticStr = %@",staticStr);
};
staticStr = @"123";
block5();
所以說,對于開頭題目的討論,之所以是3是因為他只是拷貝了變量的常量,即使對其進行__block修飾,也是不會改變,除非是將__block修飾的變量直接修改,才會引起block內(nèi)部的和變量的值的改變。
結(jié)束語
謝謝閱讀,一起學習,本人也是出于交流學習,怕自己忘記,寫的文章~