iOS面試題:一個int變量被__block修飾與否的區(qū)別?

沒有修飾坎炼,被block捕獲愧膀,是值拷貝。
使用__block修飾,會生成一個結(jié)構(gòu)體谣光,復(fù)制int的引用地址檩淋。達到修改數(shù)據(jù)。

1萄金、block截獲自動變量(局部變量)值

對于 block 外的變量引用蟀悦,block 默認是將其復(fù)制到其數(shù)據(jù)結(jié)構(gòu)中來實現(xiàn)訪問的。也就是說block的自動變量截獲只針對block內(nèi)部使用的自動變量, 不使用則不截獲, 因為截獲的自動變量會存儲于block的結(jié)構(gòu)體內(nèi)部, 會導(dǎo)致block體積變大氧敢。特別要注意的是默認情況下block只能訪問不能修改局部變量的值日戈。

2、 __block 修飾的外部變量

對于用 __block 修飾的外部變量引用孙乖,block 是復(fù)制其引用地址來實現(xiàn)訪問的浙炼。block可以修改__block 修飾的外部變量的值。

3唯袄、Block的存儲域及copy操作

先來思考一下:Block是存儲在棧上還是堆上呢弯屈?
其實,block有三種類型:

  • 全局塊(_NSConcreteGlobalBlock)
  • 棧塊(_NSConcreteStackBlock)
  • 堆塊(_NSConcreteMallocBlock)

全局塊存在于全局內(nèi)存中, 相當(dāng)于單例.
棧塊存在于棧內(nèi)存中, 超出其作用域則馬上被銷毀
堆塊存在于堆內(nèi)存中, 是一個帶引用計數(shù)的對象, 需要自行管理其內(nèi)存
簡而言之恋拷,存儲在棧中的Block就是棧塊资厉、存儲在堆中的就是堆塊、既不在棧中也不在堆中的塊就是全局塊蔬顾。

遇到一個Block宴偿,我們怎么這個Block的存儲位置呢湘捎?

(1)Block不訪問外界變量(包括棧中和堆中的變量)

Block 既不在棧又不在堆中,在代碼段中酪我,ARC和MRC下都是如此消痛。此時為全局塊。

(2)Block訪問外界變量

MRC 環(huán)境下:訪問外界變量的 Block 默認存儲棧中都哭。
ARC 環(huán)境下:訪問外界變量的 Block 默認存儲在堆中(實際是放在棧區(qū)秩伞,然后ARC情況下自動又拷貝到堆區(qū)),自動釋放欺矫。

4纱新、防止 Block 循環(huán)引用
Block 循環(huán)引用的情況:
某個類將 block 作為自己的屬性變量,然后該類在 block 的方法體里面又使用了該類本身穆趴,如下:

self.someBlock = ^(Type var){
    [self dosomething];
};

解決辦法:

(1)ARC 下:使用 __weak

__weak typeof(self) weakSelf = self;
self.someBlock = ^(Type var){
   [weakSelf dosomething];
};

(2)MRC 下:使用 __block

__block typeof(self) blockSelf = self;
self.someBlock = ^(Type var){
   [blockSelf dosomething];
};

值得注意的是脸爱,在ARC下,使用 __block 也有可能帶來的循環(huán)引用未妹,如下:

// 循環(huán)引用 self -> _attributBlock -> tmp -> self
typedef void (^Block)();
@interface TestObj : NSObject
{
    Block _attributBlock;
}
@end

@implementation TestObj
- (id)init {
    self = [super init];
    __block id tmp = self;
    self.attributBlock = ^{
        NSLog(@"Self = %@",tmp);
        tmp = nil;
   };
}

- (void)execBlock {
    self.attributBlock();
}
@end

// 使用類
id obj = [[TestObj alloc] init];
[obj execBlock]; // 如果不調(diào)用此方法簿废,tmp 永遠不會置 nil,內(nèi)存泄露會一直在

5络它、有時候我們經(jīng)常也會被問到block為什么 常使用copy關(guān)鍵字族檬?

block 使用 copy 是從 MRC遺留下來的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅化戳,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作单料。
如果不寫 copy ,該類的調(diào)用者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”


更多:iOS面試題合集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点楼,一起剝皮案震驚了整個濱河市扫尖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掠廓,老刑警劉巖换怖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟀瞧,居然都是意外死亡沉颂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門黄橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屈溉,你說我怎么就攤上這事塞关。” “怎么了子巾?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵帆赢,是天一觀的道長小压。 經(jīng)常有香客問我,道長椰于,這世上最難降的妖魔是什么怠益? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮瘾婿,結(jié)果婚禮上蜻牢,老公的妹妹穿的比我還像新娘。我一直安慰自己偏陪,他們只是感情好抢呆,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笛谦,像睡著了一般抱虐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饥脑,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天恳邀,我揣著相機與錄音,去河邊找鬼灶轰。 笑死谣沸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的框往。 我是一名探鬼主播鳄抒,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椰弊!你這毒婦竟也來了许溅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤秉版,失蹤者是張志新(化名)和其女友劉穎贤重,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體清焕,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡并蝗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秸妥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滚停。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粥惧,靈堂內(nèi)的尸體忽然破棺而出键畴,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布起惕,位于F島的核電站涡贱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惹想。R本人自食惡果不足惜问词,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘀粱。 院中可真熱鬧激挪,春花似錦、人聲如沸草穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悲柱。三九已至锋喜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豌鸡,已是汗流浹背嘿般。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涯冠,地道東北人炉奴。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蛇更,于是被迫代替她去往敵國和親瞻赶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容