為什麽block在ios中使用copy屬性?
1的申報。Block和線程安全的\x0d\Block屬性的聲明需要先使用copy修飾符,因為只有復制後的塊才會在堆中,而棧中塊的生命周期是綁定到棧的。請參考上壹篇文章(iOS:非弧下返塊)。\x0d\另壹個需要註意的問題是線程安全。在聲明Block屬性時,需要確認“在調用該塊時,另壹個線程是否有可能修改該塊?”對於這個問題,如果確定不會出現這種情況,那麽塊屬性聲明可以使用nonatomic。如果妳不確定(通常是這種情況),那麽妳需要先把Block屬性聲明為atomic,也就是先保證變量的原子性(Objective-C不強制指針讀寫的原子性,但是C#強制)。\x0d\如塊類型:\ x0d \ typedefvoid(我的塊類型)(int);\x0d\\x0d\屬性聲明:\ x0d \ @ property(copy)myblocktypemyblock;\x0d\\x0d\在這裏,弧和非弧聲明是相同的。當然要註意非弧下的releaseBlock。\x0d\\x0d\但是,用atomic來保證基本的原子性,仍然不是線程安全的。然後在調用的時候,需要先把塊賦給局部變量,防止塊突然變化。因為如果不是,即使先判斷Block屬性不為空,在調用之前,壹旦另壹個線程將Block屬性設置為空,程序就會崩潰,如下:\ x0d \ if(self.myBlock)\ x0d \ { \ x0d \/此時,self . my Block可能會被另壹個線程更改為空。//註意:atomic只會保證myBlock的原子性,這個操作本身不是線程安全的\ x0d \ self . my block(123);\x0d\}\x0d\\x0d\所以正確的代碼是(arc):\ x0d \ my block type block = self . my block;\x0d\//block現在是本地不可變的\ x0d \ if(block)\ x0d \ { \ x0d \ block(123);\x0d\}\x0d\\x0d\在非弧中,需要手動保留,否則,如果屬性為空,局部變量將成為通配符指針,如下:\ x0d \/非弧\ x0d \ myblocktypeblock =[self . myblockretain];\ x0d \ if(block)\ x0d \ { \ x0d \ block(123);\ x0d \ } \ x0d \[block release];