當前位置:編程學習大全網 - 編程語言 - ios中為什麽block要用copy屬性?

ios中為什麽block要用copy屬性?

1.Block的聲明和線程安全\x0d\Block屬性的聲明,首先需要用copy修飾符,因為只有copy後的Block才會在堆中,棧中的Block的生命周期是和棧綁定的,可以參考之前的文章(iOS:非ARC下返回Block)。\x0d\另壹個需要註意的問題是關於線程安全,在聲明Block屬性時需要確認“在調用Block時另壹個線程有沒有可能去修改Block?”這個問題,如果確定不會有這種情況發生的話,那麽Block屬性聲明可以用nonatomic。如果不肯定的話(通常情況是這樣的),那麽妳首先需要聲明Block屬性為atomic,也就是先保證變量的原子性(Objective-C並沒有強制規定指針讀寫的原子性,C#有)。\x0d\比如這樣壹個Block類型:\x0d\typedefvoid(^MyBlockType)(int);\x0d\\x0d\屬性聲明:\x0d\@property(copy)MyBlockTypemyBlock;\x0d\\x0d\這裏ARC和非ARC聲明都是壹樣的,當然註意在非ARC下要releaseBlock。\x0d\\x0d\但是,有了atomic來保證基本的原子性還是沒有達到線程安全的,接著在調用時需要把Block先賦值給本地變量,以防止Block突然改變。因為如果不這樣的話,即便是先判斷了Block屬性不為空,在調用之前,壹旦另壹個線程把Block屬性設空了,程序就會crash,如下代碼:\x0d\if(self.myBlock)\x0d\{\x0d\//此時,走到這裏,self.myBlock可能被另壹個線程改為空,造成crash\x0d\//註意:atomic只會確保myBlock的原子性,這種操作本身還是非線程安全的\x0d\self.myBlock(123);\x0d\}\x0d\\x0d\所以正確的代碼是(ARC):\x0d\MyBlockTypeblock=self.myBlock;\x0d\//block現在是本地不可變的\x0d\if(block)\x0d\{\x0d\block(123);\x0d\}\x0d\\x0d\在非ARC下則需要手動retain壹下,否則如果屬性被置空,本地變量就成了野指針了,如下代碼:\x0d\//非ARC\x0d\MyBlockTypeblock=[self.myBlockretain];\x0d\if(block)\x0d\{\x0d\block(123);\x0d\}\x0d\[blockrelease];

  • 上一篇:湖南省高中學考時間2023具體時間
  • 下一篇:增城中學的辦學成果
  • copyright 2024編程學習大全網