煩人的小東西 block塊

2021-07-06 09:09:08 字數 2198 閱讀 2255

block塊 官方名稱:閉包,類似於c語言中的匿名函式,通常作為delegate的代替品使用

block的使用和方法(函式)類似,包括宣告,實現,呼叫三個部分 不同的是block的宣告和實現可以寫在方法內部,下面是宣告block方法的幾種方式

void(^test2)(); //如果沒有引數 括號可以省略

nsinteger(^test3)();

nsinteger(^test4)(nsstring * str);

nsstring*(^test5)(nsstring * str,bool a);

實現方法

test4 = ^(nsstring * str);

block支援宣告和實現同時寫,把它們寫在一起是這樣的

void(^test6)(nsstring * text)=^(nsstring * text);

和普通方法一樣,如果不對block塊進行呼叫則block永遠不會執行,宣告是告訴編譯器,我這裡來了位block兄弟,如果有人找(呼叫)你不能說你不認識.可如果宣告了不實現就呼叫,就會造成系統崩潰,所以,在呼叫乙個無法確定有沒有被實現的block方法時需要增加乙個判斷:
//判斷方法是否存在 不存在則不呼叫 防止呼叫未實現方法引起崩潰

if (test2)

block的呼叫和c方法的呼叫方式相同,

nsinteger i = test5(@"1",yes);
block的作用範圍和變數相同,分為區域性和全域性block,區域性block只能在區域性裡面實現和呼叫,而全域性則可以在任意乙個方法體內實現和呼叫(不可以在方法體外部進行呼叫和實現,這裡和普通方法有所區別).有時候我們需要為多次重複使用的block方法定義乙個簡單的名稱:

typedef

void(^test)(nsinteger str);

這樣以後再次宣告void(^test)(nsinteger str)格式的block快時就可以:

test block1;

這樣宣告呼叫的方式不變,不過實現的時候則趨於屬性了,他是這樣的

block1 = ^(nsinteger str);

block在實際應用中,主要是用於在不同的類中傳遞資料,其傳遞特性是:必須有一方類中包含另一方類的物件,具體使用流程如下(類a 向 類b 傳值 改變類b的背景顏色):

//1.宣告乙個 block 型別,返回值表明傳值的結果,引數表明傳值的資料。

typedef

void(^block)(uicolor* color);

//2.宣告乙個 block 屬性。

@property (nonatomic, copy) block block;

//3.呼叫 block 進行傳值。

if (_block)

//4.實現 block 並獲取傳過來的值。

vc.block = ^(uicolor* color);

第1 2 3 是類a中的**4為類b中的**.

block中的記憶體管理比較複雜,對於block自身的記憶體管理與其他型別的變數或屬性相同,宣告為屬性時需要用copy,但是block不僅要管理自身的記憶體.它還會對方法快中使用的外部變數進行引用計數加一,如果使用了本類物件的屬性.那麼就會對self進行retain,這是非常糟糕的事情,會讓你的記憶體管理變得無從下手,什麼時候釋放?釋放誰?怎麼解決self被retain後的迴圈引用問題?有乙個很簡單的辦法:
//使用__block語句修飾將要在block塊中使用的物件

__block nsarray* array1 = [[nsarray alloc] initwithobjects:@"array1object", nil];

//如果是 self,需要這樣做,宣告新的 __block 修飾的變數等於 self,然後在 block 中使用新的變數代替 self。

__block viewcontroller* blockself = self;

block中是不允許修改外部變數的值得,如果必須要修改則需要在變數前面新增__block 否則將會失敗

雖然寫了這麼多,可看了更多的部落格以後發現自己對block的認知越來越模糊了.什麼時候使用,怎麼正確的使用又成了問題.

做完小東西

想一想,時間過得挺快的,暑假的三分之一就這樣過去了。從工學一號館斷網開始我已經好些天沒更新部落格了。一是自己發懶,二是在做那個練手的小工具沒去想這個。今晚交完專案,塵埃落定,說說這些天的情況和想法。團隊不是天生的,是需要磨合的。我和健輝意見不同的時候挺多的,有時兩個人都挺固執的,就認為自己說的對,這...

oracle 小東西記錄

alter table table name modify id number 修改列型別 alter table table name add state number 新增列 sysdate 直接插入當前時間 to date 2013 06 26 23 59 59 yyyy mm dd hh24...

MySql裡的小東西

1 類似oracle的序列的用法 id int 5 primary key auto increment 2 類似ms sql裡sql 查詢語句中top關鍵字 如果就是top著個含義 select from table limit 10 就行了 如果想取出100 到 200 用 select fro...