2014-02-10 27 views
2

Iam是iOS塊的全新組件。我讀過一本關於ios中嵌入塊的書。內嵌塊究竟是什麼?我們可以將它用於任何物體嗎?普通塊和內嵌塊之間有什麼區別?iOS中的嵌入塊

這是我在書

看到使用在線塊代替

NSArray* arr2 = [arr sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    NSString* s1 = obj1; 
    NSString* s2 = obj2; 
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1]; 
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1]; 
    return [string1end compare:string2end]; 
}]; 

塊定義內聯,如在上面的例子中的回調函數,是不可重複使用;如果我們有兩次調用排序ArrayUsingComparator:使用相同的回調,我們必須全部寫出回調兩次。爲了避免這種重複,或者僅僅爲了清楚起見,可以將塊分配給變量,然後將其作爲參數傳遞給期望塊的方法,如下例所示。 分配一個塊到可變

NSComparisonResult (^sortByLastCharacter)(id, id) = ^(id obj1, id obj2) { 
    NSString* s1 = obj1; 
    NSString* s2 = obj2; 
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1]; 
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1]; 
    return [string1end compare:string2end]; 
}; 

的NSArray * ARR2 = [ARR sortedArrayUsingComparator:sortByLastCharacter]; NSArray * arr4 = [arr3 sortedArrayUsingComparator:sortByLastCharacter]; 也許塊的最顯着的特徵是:塊定義點處的變量在範圍內保持它們的值,即使該塊可能在稍後時刻被執行。 (從技術上講,我們說一個塊是一個閉包,塊之外的變量值可能被塊捕獲。)塊的這個方面使它們有用於指定稍後或甚至某些其他時間要執行的功能線。

+1

這本書說什麼?那麼你不明白嗎?這本書沒有舉例說明嗎? – Wain

回答

5

這可能意味着,你可以直接把塊的定義代替塊說法:

給出一個API與塊的參數:

- (void) doSomethingWithBlock:(void(^)(id param))block; 

注塊的類型是

typedef void(^block_type)(id param); 

即,它有參數id類型的PARAM並返回void

現在,你可以定義一個模塊內聯:

... 
[self doSomethingWithBlock:^(id param) { 
    // implementation 
}); 

,而不是限定阻擋 「脫節」:

block_type myBlock = ^(id param) { 
    // implementation 
}; 

,並通過調用它:

[self doSomethingWithBlock:myBlock];