例子1
?
1
2
3
4
5
6
void
examplea() ();
}
這個例子:
a.始終能夠正常執行 b.只有在使用arc的情況下才能正常執行
c.不使用arc才能正常執行 d.永遠無法正常執行
例子2:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
void
exampleb_addblocktoarray(
nsmutablearray
*array) ];
}
void
exampleb()
a.始終能夠正常執行 b.只有在使用arc的情況下才能正常執行
c.不使用arc才能正常執行 d.永遠無法正常執行
例子3?
12
3
4
5
6
7
8
9
10
11
12
void
examplec_addblocktoarray(
nsmutablearray
*array) ];
}
void
examplec()
a.始終能夠正常執行 b.只有在使用arc的情況下才能正常執行
c.不使用arc才能正常執行 d.永遠無法正常執行
例子4?
12
3
4
5
6
7
8
9
10
11
12
typedef
void
(^dblock)();
dblock exampled_getblock() ;
}
void
exampled()
a.始終能夠正常執行 b.只有在使用arc的情況下才能正常執行
c.不使用arc才能正常執行 d.永遠無法正常執行
例子5?
12
3
4
5
6
7
8
9
10
11
12
13
14
typedef
void
(^eblock)();
eblock examplee_getblock() ;
return
block;
}
void
examplee()
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...