面試加分題 OC中block的基本用法與深入了解

2021-07-03 21:05:46 字數 1400 閱讀 8097

block是一種資料型別,可以使一段**塊變成乙個變數,格式和函式很像.

1,無參無返回: void (^myblock)() = ^();(無參的話前面小括號可以省略,後面分號不能少).

2,有參無返回: void (^myblock)(int,int) = ^(int a, int b);(有引數的話,'='號後面的形參名不能省).

3,無參有返回: int (^myblock)() = ^;

4,有參有返回:int (^myblock)(int , int) = ^(int a ,int b);

和函式不同的是block可以在內部訪問外部的變數,但是不能給外部變數重新賦值,因為在內部使用的外部變數是copy的新的外部變數,記憶體位置不一樣.

在block內部也可以定義和外部同名的變數,這樣就會遮蔽外部變數的作用域,內部無法使用外部變數.

在預設的情況下,內部不能修改外部變數.當給外部的區域性變數加上__block修飾詞,則內部可以改變該變數.

因為儲存的位置不同,block也分為三種:

1,全域性block(__nsglobalblock__):類似函式,儲存在**區,arc與mrc一樣只要沒有使用外部變數,就是全域性block.

2,堆block(__nsmallocblock__):儲存在堆區的block,在arc下使用了外部變數,就是堆block.在mrc下把棧block進行copy操作 就會得到堆block.

3,棧block(__nsstackblcok__):儲存在棧區的block,在mrc下使用了外部變數,就是棧block.

block使用外部變數並不是直接使用,而是把外部變數拷貝乙份.在arc下,外部變數被拷貝到堆區,而在mrc下外部變數被拷貝到棧區!

在arc與mrc下,如果不做任何修飾都不可以,block內部使用的外部變數和外部的變數已經不是乙個位址了.而block在使用外部變數時,會把外部變數以 const(不可更改)的格式拷貝乙份使用!

在定義外部變數的時候新增修飾詞__block,新增__block的外部變數在blcok中不再以const的格式拷貝,而是都copy到堆區,__blcok的作用就是讓系統忽視block中修改外部變數的問題!

解決辦法是,把引數換成copy或strong.

答案是肯定的!因為在mrc下,用了外部變數的b1是乙個棧block,而在棧區的**只能在作用域內使用,所以bb接收不到test()的返回值.

通過上述操作可以解決這個問題.而在arc中不會存在這個問題,因為編譯器會自動在合適的位置新增retain和release方法!

OC中的Block,多型

首先我們來找一下每個區域內的記憶體位址 棧int a 10 nslog p a 堆 int p malloc 40 nslog p p 全域性靜態區 static int b 10 nslog p b 常量區 常量字串,儲存的是首位址 char str iphone nslog p str 區 ns...

oc中block的理解

block可能是我在學習objective c語法中遇到的第乙個puzzle的地方。確實,這個語法takes some getting use to.block實際是一種閉包,它是oc中對閉包的實現。閉包是什麼?清楚地記得這個是我去年在參加鵝廠的實習筆試的時候的乙個大題,記得沒錯是第二個大題。any...

OC 中的block使用

在ios的開發過程中,使用塊的地方很多也很方便,但是在使用塊的過程中要注意記憶體洩露的問題。在塊建立的時候,會對塊內的所有物件的引用計數加一,直到塊銷毀,所以在使用塊的過程中需要我們進行處理,在這裡以afnetworking的 舉例,如下 weak typeof self weakself self...