OC Block网上转载
生活随笔
收集整理的這篇文章主要介紹了
OC Block网上转载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.block是一個特殊的OC對象, 它建立在棧上, 而不是堆上, 這么做一個是為性能考慮,還有就是方便訪問局部變量. 2.默認情況下block使用到的局部變量都會被復制,而不是保留.所以它無法改變局部變量的值. 3.如果在變量面前加上__block, 那么編譯器回去不會復制變量, 而是去找變量的地址, 通過地址來訪問變量, 實際上就是直接操作變量. 4.另外塊是在棧上分配的, 所以一旦離開作用域, 就會釋放, 因此如果你要把塊用在別的地方, 必須要復制一份. 所以在屬性定義一個塊的時候需要使用copy: ?@property (nonatomic, copy) void (^onTextEntered)(NSString *enteredText); 5.塊是不能保留的, retain對塊沒有意義. 6.使用typed聲明block ??typedef void(^didFinishBlock) (NSObject *ob);? 這就聲明了一個didFinishBlock類型的block,然后便可用@property (nonatomic,copy) didFinishBlock ?finishBlock; 聲明一個block對象,注意對象屬性設置為copy,接到block 參數時,便會自動復制一份。? __block是一種特殊類型,使用該關鍵字聲明的局部變量,可以被block所改變,并且其在原函數中的值會被改變。
ARC和非ARC中block的區別: ARC下Block何時會從棧自動被復制到推, 以及__block和__weak的使用問題 由于Block是默認建立在棧上, 所以如果離開方法作用域, Block就會被丟棄, 在非ARC情況下, 我們要返回一個Block ,需要 [Block copy]; 在ARC下, 以下幾種情況, Block會自動被從棧復制到堆: 1.被執行copy方法 2.作為方法返回值 3.將Block賦值給附有__strong修飾符的id類型的類或者Blcok類型成員變量時 4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中傳遞的時候. 對于非ARC下, 為了防止循環引用, 我們使用__block來修飾在Block中實用的對象: __block id blockSelf=self; self.blk=^{ NSLog(@"%@",blockSelf); ?//在非ARC下對于棧上的_block對象, Block不會對其復制, 僅僅使用, 不會增加引用計數. }; 對于ARC下, 為了防止循環引用, 我們使用__weak來修飾在Block中實用的對象: __weak id weakSelf=self; self.blk=^{ NSLog(@"%@",weakSelf); }; 如果要在ARC下, 為了防止循環引用, 使用__block來修飾在Block中實用的對象,仍然會被retain, 所以需要多做一些設置 __block id blockSelf=self; self.blk=^{ NSLog(@"%@",blockSelf); self.blk=nil; ? //blk被釋放, blk只有的blockSelf也就被釋放了 }; blk(); ? //并且一定要運行一次, 否則不能被釋放 這樣就使blk斷開了與blockSelf的持有關系. 這么多好處是可以自己控制對self的持有時間. 不過在最新的ios版本中, 這些會始終被已嘆號形式提示存在循環引用問題.? 這種書寫方式不被推薦. 除非你要在block中修改__block的指針指向. 其實我們用使用__weak修飾符, 只是不能修改對象本身, 但是可以修改對象的屬性. 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
ARC和非ARC中block的區別: ARC下Block何時會從棧自動被復制到推, 以及__block和__weak的使用問題 由于Block是默認建立在棧上, 所以如果離開方法作用域, Block就會被丟棄, 在非ARC情況下, 我們要返回一個Block ,需要 [Block copy]; 在ARC下, 以下幾種情況, Block會自動被從棧復制到堆: 1.被執行copy方法 2.作為方法返回值 3.將Block賦值給附有__strong修飾符的id類型的類或者Blcok類型成員變量時 4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中傳遞的時候. 對于非ARC下, 為了防止循環引用, 我們使用__block來修飾在Block中實用的對象: __block id blockSelf=self; self.blk=^{ NSLog(@"%@",blockSelf); ?//在非ARC下對于棧上的_block對象, Block不會對其復制, 僅僅使用, 不會增加引用計數. }; 對于ARC下, 為了防止循環引用, 我們使用__weak來修飾在Block中實用的對象: __weak id weakSelf=self; self.blk=^{ NSLog(@"%@",weakSelf); }; 如果要在ARC下, 為了防止循環引用, 使用__block來修飾在Block中實用的對象,仍然會被retain, 所以需要多做一些設置 __block id blockSelf=self; self.blk=^{ NSLog(@"%@",blockSelf); self.blk=nil; ? //blk被釋放, blk只有的blockSelf也就被釋放了 }; blk(); ? //并且一定要運行一次, 否則不能被釋放 這樣就使blk斷開了與blockSelf的持有關系. 這么多好處是可以自己控制對self的持有時間. 不過在最新的ios版本中, 這些會始終被已嘆號形式提示存在循環引用問題.? 這種書寫方式不被推薦. 除非你要在block中修改__block的指針指向. 其實我們用使用__weak修飾符, 只是不能修改對象本身, 但是可以修改對象的屬性. 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的OC Block网上转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译] NSRegexTester
- 下一篇: .Net Core下如何管理配置文件