ios 中的程式塊(Block)

2022-08-05 12:09:15 字數 998 閱讀 9981

block是乙個自包含的小**段,封裝了用於遍歷(線性遍歷)或者**,可以併發執行的任務單元。

__block int mycount = 0;

int (^myblock)(int a,int b) = ^(int a,int b);

nslog(@"myblock = %d",myblock(1,2));

1

int (^myblock)(int a,int

b);2

3 myblock = ^(int a,int

b);

1

int jg = ^(int a) (3

);2 nslog(@"

jg = %d

",jg);

後面小括號裡的3 會被當成a的輸入值,然後經由block輸出3*3 = 9指定給result這個變數。

因為block也是繼承自nsobject,所以其生命週期和記憶體的管理也就非常之重要。

block一開始都是被放到stack裡,換句話說其生命週期隨著method或function結束就會被**,和一般變數的生命週期一樣。

關於記憶體的管理請遵循這幾個要點

1. block pointer的實體會在method或function結束後就會被清掉

2. 如果要儲存block pointer的實體要用-

copy

指令,這樣block pointer就會被放到heap裡

2.1 block 主體裡用到的block variable 也會被搬到heap 而有新的記憶體位置,且一併更新有用到這個block variable 的block都指到新的位置

2.2 一般的variable值會被copy 

2.3 如果主體裡用到的variable是object的話,此object會被retain, block release時也會被release

2.4 __block variable 裡用到的object是不會被retain的

iOS 中的block異常

ios 知識小集 我們在呼叫block時,如果這個block為nil,則程式會崩潰,報類似於exc bad access code 1,address 0xc 異常 32位下的結果,如果是64位,則address 0x10 如圖1,這個異常表示程式在試圖讀取記憶體位址0xc的資訊時出錯。在定義乙個b...

IOS中Block的使用

block的宣告 1,void myblock 2,int myblock float,int 3,nsstring myblock int,nsstring 也可以使用typedef為block定義別名。三種block的特性 block是乙個object物件,所以我們需要對它進行記憶體管理。blo...

block塊的獲取

用流copy獲取第二個block塊的內容 public void downloadbyseek throws illegalargumentexception,ioexception 建立輸出流,指定位置.fileoutputstream fostream new fileoutputstream ...