我認為block主要是替代selector。對于一個包含少量代碼的方法可以放到一個block中而不用重新定義個方法,增加代碼的可讀性。
成都創新互聯公司是一家專注于成都做網站、成都網站建設與策劃設計,平武網站建設哪家好?成都創新互聯公司做網站,專注于網站建設十載,網設計領域的專業建站公司;建站業務涵蓋:平武等地區。平武做網站價格咨詢:13518219792
比如通知中心(NSNotificationCenter)事件的回調(addObserver)可以指定一個函數,也可以直接用block,(@selector或者usingBlock^),如果只要執行簡單的幾句代碼,就可使用后者,省去新定義一個方法的麻煩。
不過使用block時需要注意一些問題,尤其引用計數的問題會導致一些東西不能正常釋放,具體需要多看些資料。
跟delegate沒什么關系。
Block有三種類型:
我們在講 block的本質 的時候已經知道了,block的本質就是一個 OC 對象,那么既然它是一個 OC 對象,它就會有類型,本文就將講解 block 的三種類型.并都繼承于NSBlock
我們在講 block 的三種類型之前,先了解一下程序的內存分配情況,因為不同類型的 block 分配的內存也不同.
結論: 沒有訪問 auto變量 的block 就是 __NSGlobalBlock
結論:訪問了auto變量 的block 就是 __NSStackBlock
怎么打印的是 NSMallocBlock ,剛才不是說訪問了auto變量就是__NSStackBlock嗎?
因為這里我們使用的是ARC,在ARC環境下,Xcode編譯器再某些情況會默認幫我們做調用copy 變成堆block ,我們在Build Settings中把ARC設置成MRC,再來打印一下:
這次打印的就是 NSStackBlock
我們思考一下,__NSStackBlock在訪問外部變量時,會有什么問題?
會出現野指針crash 所以在ARC壞境Xcode幫我們處理成了堆block( NSMallocBlock )防止出現釋放了還去訪問導致野指針crash
結論: 當一個__NSStackBlock調用了copy操作,返回的就是一個__NSMallocBlock
以上都是在MRC環境下
如果是在ARC環境下,編譯器會根據情況自動將棧上的block復制到堆上 , 比如以下幾種情況:
1:一共有三種類型的Block.分為__NSGlobalBlock,__NSStackBlock,__NSMallocBlock.
沒有訪問 auto變量 的block 就是 __NSGlobalBlock
訪問了auto變量 的block 就是 __NSStackBlock
當一個__NSStackBlock調用了copy操作,返回的就是一個__NSMallocBlocksing
2:在ARC環境下,編譯器會自動把棧上的block copy到堆上
block是一個代碼塊,比如一些其它Web編程語言中的“匿名函數”。在objc中通常使用block實現代理方法實現的功能,也就是回調。使用代理需要設置代理的數據接收者,而且代理方法是被分離開來處理的,block可以將這些分離的代碼放到一個代碼塊中。
/////////.h
typedef void(^MyBlock)(int value);
@property (nonatomic,weak) MyBlock block;
-(void)setMyBlock:(void(^)(int value)) block;
/////////.m
-(void)setMyBlock:(void(^)(int value)) block {
if (block) {
self.block=block;
}
}
開發中使用block進行回調傳遞消息、傳遞參數還是很方便的。
1.使用一個網絡請求工具進行某個頁面的網絡數據請求,在數據請求下來之后使用block回調,將請求下來的網絡數據返回給某個頁面使用。
2.點擊自定義的UITableViewCell上的一個按鈕,使用block回調,讓我們知道點擊的是哪個cell。
1.將block作為參數使用
2.將block作為屬性使用
下面直接看圖:
block如果作為參數使用,那么我們既可以在對象方法中使用block,也能在類方法中使用block。如果沒有必要創建對象,那就直接使用類方法。
****本篇文章到這里就結束了,愿大家加班不多工資多,男同胞都有女朋友,女同胞都有男朋友。????***