2010-02-12 39 views
3

查看JSON框架源代碼,它在很多解析器方法簽名中大量使用了引用傳遞。即Objective-C中使用傳遞引用C

@interface SBJsonParser() 
    - (BOOL)scanValue:(NSObject **)o; 
    - (BOOL)scanRestOfArray:(NSMutableArray **)o; 
    - (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o; 
@end 

這最終被使用是這樣的:

id o; 
[self scanValue:&o]; 
// Do something with o 

- (BOOL)scanValue:(NSObject **)o { 
    // Cut down for brevity 
    return [self scanRestOfDictionary:(NSMutableDictionary **)o]; 
} 

- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o { 
    // Cut down for brevity 
    *o = [NSMutableDictionary dictionaryWithCapacity:7]; 
    [*o setObject:@"value" forKey:@"key"]; 
    return YES; 
} 

什麼是這種方法的好處?


編輯:我問從設計的角度來看多。我明白通過引用傳遞的是什麼,我只是想知道什麼時候適合使用它。在SBJsonParser的設計很相似,在NSScanner使用的API:

- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue; 

對我來說,這意味着這是掃描的字符串是次要的需要知道,如果事情掃描。這是相對於由NSString使用的API:

+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error; 

在這種API,該文件的內容是主要的關注,並NSError引用用於傳回事件的錯誤出錯。

就在什麼時候最適合哪種API的一般想法之後。

+0

這種技術通常被稱爲'引用返回'而不是'引用傳遞',因爲它通常被用來允許被調用者向調用者提供超出常規返回值的附加值。 – jlehr 2013-10-11 17:15:59

回答

2

這些是「輸出」參數。它們允許被調用的方法爲本地變量「o」賦值。換句話說,你沒有傳入對象的引用,而是對局部變量的引用。

在你的情況下,這些方法返回一個BOOL來指示成功或失敗;因此,他們使用輸出參數來返回其他值和對象。

+0

查看我在問題底部的說明。 – 2010-02-12 04:10:21

2

這真的只是一個風格問題。它應該在整個API中保持一致。

一方面,您有一種風格,其中始終返回呼叫的狀態碼,並且呼叫的輸出位於參數列表中。

好處?您可以隨時檢查通話結果是否成功。您可以輕鬆地擁有多個返回值,而無需更改樣式。

缺點?不能只是在通話中代替參數。更難以鏈接。

另一方面,您有一種從調用返回主數據並通過輸出參數完成任何錯誤代碼的樣式。

好處和缺點基本上是相反的。

公平地說,還有第三種風格:不傳遞或返回結果。相反,使用例外。

好處?更清潔的代碼。

缺點?適用於錯誤,但對於可能伴隨有效返回碼的狀態碼不太適用。