blocks在Object C中的作用

2021-07-29 14:28:30 字數 3706 閱讀 6585

例子1

?

1

2

3

4

5

6

voidexamplea() ();

}

這個例子:

a.始終能夠正常執行                b.只有在使用arc的情況下才能正常執行

c.不使用arc才能正常執行   d.永遠無法正常執行

例子2:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

voidexampleb_addblocktoarray(nsmutablearray*array) ];

}

voidexampleb()

a.始終能夠正常執行                b.只有在使用arc的情況下才能正常執行

c.不使用arc才能正常執行   d.永遠無法正常執行

例子3?

12

3

4

5

6

7

8

9

10

11

12

voidexamplec_addblocktoarray(nsmutablearray*array) ];

}

voidexamplec()

a.始終能夠正常執行                b.只有在使用arc的情況下才能正常執行

c.不使用arc才能正常執行   d.永遠無法正常執行

例子4?

12

3

4

5

6

7

8

9

10

11

12

typedefvoid(^dblock)();

dblock exampled_getblock() ;

}

voidexampled()

a.始終能夠正常執行                b.只有在使用arc的情況下才能正常執行

c.不使用arc才能正常執行   d.永遠無法正常執行

例子5?

12

3

4

5

6

7

8

9

10

11

12

13

14

typedefvoid(^eblock)();

eblock examplee_getblock() ;

returnblock;

}

voidexamplee()

a.始終能夠正常執行                b.只有在使用arc的情況下才能正常執行

c.不使用arc才能正常執行   d.永遠無法正常執行

答案

答案

例子1a正確。這個例子可以正常執行。儲存examplea的棧只有在block停止執行之後才會釋放,因此,無論此block由系統分配到棧中還是我們自己手動分配到堆中,它都可以正常執行。

例子2b正確。如果不使用arc,這個block是乙個nsstackblock,分配給exampleb_addblocktoarray的棧上。而當它在exampleb中執行的時候,由於棧被清空,block不再有效。

而使用arc的話,block會分配到堆中,作為乙個自動釋放的nsmallocblock

例子3a正確由於block在自己的環路中不會抓取任何變數,它不需要在在執行的時候設定state,它會作為乙個nsglobalblock編譯。它既不是棧也不是堆,而是**片段的一部分。所以它始終都能正常執行。

例子4b正確。這個例子和例子2類似。如果不使用arc,block會在exampled_getblock的棧上建立起來。然後當功能返回的時候會立即失效。

然而,以這個例子來說,這個錯誤非常明顯,所以編譯器進行編譯會失敗,錯誤提示是:error: returning block that lives on the local stack(錯誤,返回的block位於本地的棧)。

例子5b正確。這個例子和例子4類似,除了編譯器沒有認出有錯誤,所以**會進行編譯然後崩潰。更糟糕的是,這個例子比較特別,如果你關閉了優化,則可以正常執行。所以在測試的時候需要注意。

而如果使用arc的話,block則會正確的位於堆上,作為乙個自動釋放的nsmallocblock。

結論這套小測試有什麼意義呢?意義就是要一直使用arc。使用arc,block大部分情況下都可以正常執行。

如果不使用arc,謹慎起見,可以block = [[block copy] autorelease],這樣block會比申明它的棧flame的有效期長。這樣block會被作為乙個nsmallocblock強制複製到堆上。

但是,當然不會這麼簡單,根據蘋果的文件,

block只有當你在arc模式下傳遞block到棧上才會工作,比如說返回的時候。你不需要再次呼叫block copy了。但是當block從棧上傳遞到 arraywithobjects: 和其他做了乙個retain的方法是時,仍然需要使用[^{} copy]。

但是有乙個llvm的維護者之後也說過:

我們認為這是編譯器的bug,它現在已經修復了。但是xcode以後是否會在以後發布的新版本中解決這個問題,我也不知道。

所以,希望,蘋果也把它認為是乙個bug,在以後的新版本中會解決這個問題。讓我們看看會怎麼樣吧。

原文:

在object c 中呼叫c,c 介面

第一步 定義c語言 介面 file.c include void printsbyc 第二步 定義c 介面 student.h檔案 ifndef test hun student define test hun student include endif defined test hun stude...

Objective C中Blocks塊的介紹

注 解釋內容主要參考 objective c 高階程式設計 1.介紹 blocks是c語言的擴充功能 帶有自動變數 區域性變數 的匿名函式。blocks的語法 返回值型別 引數列表 表示式 例如 int int c 其中,返回值型別 是可以省略的,會按return型別返回,如果不需要引數,那麼 引數...

Object C中管理記憶體

object c之中採用一種保留記錄的方式記錄我們所建立的所有的物件,並且,當該計數減少為0的時候,object c自動收回分配給乙個物件的記憶體。text text1 text alloc init text text2 text alloc init 每乙個物件的計數都為1,我們可以通過reta...