iOS中為什么block用copy屬性

Block的聲明和線程安全

Block屬性的聲明缴川,首先需要用copy修飾符茉稠,因為只有copy后的Block才會在堆中,棧中的Block的生命周期是和棧綁定的把夸。

另一個需要注意的問題是關于線程安全而线,在聲明Block屬性時需要確認“在調用Block時另一個線程有沒有可能去修改Block?”這個問題恋日,如果確定不會有這種情況發(fā)生的話膀篮,那么Block屬性聲明可以用nonatomic。如果不肯定的話(通常情況是這樣的)岂膳,那么你首先需要聲明Block屬性為atomic誓竿,也就是先保證變量的原子性(Objective-C并沒有強制規(guī)定指針讀寫的原子性,C#有)闷营。

比如這樣一個Block類型:

typedef void (^MyBlockType)(int);
// 屬性聲明:
@property (copy) MyBlockType myBlock;

這里ARC和非ARC聲明都是一樣的,當然注意在非ARC下要release Block知市。

但是傻盟,有了atomic來保證基本的原子性還是沒有達到線程安全的,接著在調用時需要把Block先賦值給本地變量嫂丙,以防止Block突然改變娘赴。因為如果不這樣的話,即便是先判斷了Block屬性不為空跟啤,在調用之前诽表,一旦另一個線程把Block屬性設空了,程序就會crash隅肥,如下代碼:

if (self.myBlock)
{
    //此時竿奏,走到這里,self.myBlock可能被另一個線程改為空腥放,造成crash
    //注意:atomic只會確保myBlock的原子性泛啸,這種操作本身還是非線程安全的
    self.myBlock(123);
}

所以正確的代碼是(ARC):

MyBlockType block = self.myBlock;
//block現(xiàn)在是本地不可變的
if (block)
{
    block(123);
}

在非ARC下則需要手動retain一下,否則如果屬性被置空秃症,本地變量就成了野指針了候址,如下代碼:

//非ARC
MyBlockType block = [self.myBlock retain];
if (block)
{
    block(123);
}
[block release];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市种柑,隨后出現(xiàn)的幾起案子岗仑,更是在濱河造成了極大的恐慌,老刑警劉巖聚请,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠雕,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機舞虱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門欢际,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矾兜,你說我怎么就攤上這事损趋。” “怎么了椅寺?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵浑槽,是天一觀的道長。 經常有香客問我返帕,道長桐玻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任荆萤,我火速辦了婚禮镊靴,結果婚禮上,老公的妹妹穿的比我還像新娘链韭。我一直安慰自己偏竟,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布敞峭。 她就那樣靜靜地躺著踊谋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旋讹。 梳的紋絲不亂的頭發(fā)上殖蚕,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音沉迹,去河邊找鬼睦疫。 笑死,一個胖子當著我的面吹牛鞭呕,可吹牛的內容都是我干的笼痛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼琅拌,長吁一口氣:“原來是場噩夢啊……” “哼缨伊!你這毒婦竟也來了?” 一聲冷哼從身側響起进宝,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤刻坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后党晋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭胚,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡徐块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灾而。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡控。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旁趟,靈堂內的尸體忽然破棺而出昼激,到底是詐尸還是另有隱情,我是刑警寧澤锡搜,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布橙困,位于F島的核電站,受9級特大地震影響耕餐,放射性物質發(fā)生泄漏凡傅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一肠缔、第九天 我趴在偏房一處隱蔽的房頂上張望夏跷。 院中可真熱鬧,春花似錦明未、人聲如沸槽华。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼莽。三九已至庶溶,卻和暖如春煮纵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偏螺。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工行疏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人套像。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓酿联,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夺巩。 傳聞我的和親對象是個殘疾皇子贞让,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 簡單來說,block就像一個函數(shù)指針柳譬,指向我們要使用的函數(shù)喳张。 就和函數(shù)調用一樣的,不管你在哪里寫了這個block美澳,...
    William__Lu閱讀 773評論 0 0
  • 基礎 1. 為什么說Objective-C是一門動態(tài)的語言销部? 2. 講一下MVC和MVVM摸航,MVP? 3. 為...
    波妞和醬豆子閱讀 3,319評論 0 46
  • 把網上的一些結合自己面試時遇到的面試題總結了一下舅桩,以后有新的還會再加進來酱虎。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,562評論 0 20
  • 2017.4.9 昨天的一場雨讓校園的花放肆地開,我卻清晰地記得最初見到它們的模樣擂涛。想想馬上要畢業(yè)的光景读串,...
    _沐溪閱讀 131評論 0 1
  • 2015年,在簡書的第一篇文章〖咧福現(xiàn)在是凌晨一點爹土,有人在睡覺有人在刷微博。自從學了這個專業(yè)感覺組織語言的能力越來越下...
    五十弦客閱讀 589評論 0 5