1.1 什麼是block
在多線程和網絡也使用得相當頻繁,一般都是作為回調使用!
Xcode輸入 inline 可快速生成(快捷鍵)
1.2 block的格式
如果block沒有參數, 那麼^後面的()可以省略
1.3 給block類型取別名(類比函數指針)
變量的名稱就是類型名稱(即別名)
1.4 block的應用場景
當前面代碼塊一樣,後面代碼塊一樣,中間的代碼塊不一樣,中間的代碼塊就用block。
1.5 block的注意事項
(1)在代碼塊中可以直接訪問和修改非棧區的變量(使用的是同一個變量)
(2)棧區的變量可以訪問,但默認不能修改(使用的是不同的變量,實際上訪問的是自己拷貝的值)
block中的變量和外界的局部變量並不是同一個變量,block會將外界的變量拷貝一份到堆內存中
block中使用的外界變量是copy的,所以在調用之前修改外界變量的值,不會影響到block中copy的值
(3)在代碼塊中修改局部變量編譯不通過。怎麼在代碼塊中修改局部變量呢?在局部變量前面加上關鍵字:__block
1.6 面試題:block是存儲在堆中還是棧中?
1.7 block的內存洩露體現
block在copy時都會對block內部用到的對象進行強引用(ARC)或者retainCount增1(非ARC)。
在ARC與非ARC環境下對block使用不當都會引起循環引用問題。
一般表現為:
某個類將block作為自己的屬性變量,然後該類在block的方法體裡面又使用了該類本身,簡單說就是
1)MRC情況下,用__block可以消除循環引用。
2)ARC情況下,必須用弱引用才可以解決循環引用問題,IOS5之後可以直接使用__weak,之前則只能使用__unsafe_unretained了,__unsafe_unretained缺點是指針釋放後自己不會置空。
什麼時候棧上的Block會復制到堆呢?
block很多的用處是跨越兩個類來使用的。
實現兩個頁面之間的傳值:
面試題:
【iOS開發入門 ☞ OC語言·筆記八】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!