objective-c中NSArray的enumerateObjectsUsingBlock方法是如何實現的
在調用方法時提供代碼塊
^(id obj, NSUInteger idx, BOOL *stop) {}
在代碼塊中可以讀到array中的信息,代碼塊中的參數是如何傳進去的?
謝謝。
???
當你聲明一個方法需要一個塊作為參數的話,在生命函數時就要指定塊的返回值、參數、并且給塊指定一個參數名稱,例:
-
(void)HttpPostRequestStr:(NSString *)parameters
reqType:(int)req_type isPersonal:(BOOL)isPersonal success:(void (^)(NSDictionary *responseDic))success failure:(void (^)(NSError *error))failure
這個方法中我就指定了一個網絡請求成功的回調塊以及一個網絡請求失敗的回調塊
他們都是無返回類型,一個需要NSDictionary類型的,另外一個需要一個NSError類型的參數,塊的名稱分別為success與failure
而我在方法內調用他們的就很簡單了
只需要打出塊名稱跟括號,并在括號內給入相應的參數,跟C/C++之中調用函數的寫法非常像,如下:
NSDictionary *tmp_dic = [[NSDictionary alloc] init];
success(tmp_dic);
追問
可能是我問題描述不夠清楚,我想問的其實是,例如一個NSArray的實例變量調用
enumerateObjectsUsingBlock:這個方法的時候,在代碼塊中obj、idx都是可以直接讀取而不用自己去傳參的,這個是如何做到的呢?
追答
因為參數是在enumerateObjectsUsingBlock方法中調用你的塊并傳入的啊,要求你傳入塊參數的目的通常就是回調或完成類似委托的行為,讓你在方法執行到某個步驟或結束時可以進行異步處理操作,在封裝enumerateObjectsUsingBlock時你的傳入的塊所需要什么參數就已經被指定了,因為方法的封裝者會提供或者說只能提供給你規定好的參數,也就是說你只要將,已經指定好參數的塊,按照方法的參數要求,傳入方法中,方法就會調用你的塊并將參數傳入
或許你是沒理解塊的執行時機?你傳入的塊并不是順序執行下去的,而是方法的分裝者在特定情況下調用你的塊時你的塊才會執行,并且這是異步執行,你調用方法的代碼在你將塊傳入后就已經結束,這時你的塊并沒有執行