2010-07-26 72 views
19

我試圖通過參考NSString,但它不起作用。參考Objective-C中的參數

這是函數:

+(void)fileName:(NSString *) file 
{ 
    file = @"folder_b"; 
} 

,這是呼叫:

NSString *file; 

[function fileName:file]; 

nslog(@"%@",file); // and there is nothing in the string.... 

,我該做什麼按引用傳遞我的字符串?

回答

30

我相信你正在尋找:

+ (void)fileName:(NSString **)file 
{ 
    *file = @"folder_b"; 
} 

什麼是真的在這裏做的是我們的指針工作的指針的對象。檢查C(是的,只是簡單的C)指南「指針取消引用」的進一步信息。

(...但是作爲已經多次指出,在這個特殊的例子,沒有任何理由通過引用都傳遞:只返回一個值。)

+5

+1方法調用必須改爲[function fileName:&file] – 2010-07-26 02:01:54

+2

@bbum:參數*可能*是一個輸入/輸出參數,但即使如此。 。 。 – dreamlax 2010-07-26 03:42:47

-2

我懷疑這是因爲NSString是不可變的。你有沒有試過NSMutableString

+0

使用可變字符串不能將變量「設置」爲新對象,因此在給定示例中嚴格無效。但取決於具體情況,它可能是最好的方法(+1)(而不是雙對象ptr) – Akusete 2010-07-26 01:58:50

+0

一種選擇是傳遞一個'NSMutableString'然後使用'setString:',但那不會是「引用」。 – andyvn22 2010-07-26 02:01:06

+0

@andyvn:你說得對,我的觀點是(通常情況下)是技術上寫的問題的答案,而問題的最佳解決方案並不是一回事。 – Akusete 2010-07-26 02:08:44

63

如果你想返回一個值,然後返回值。 Cocoa/iOS中的引用傳遞大部分限於NSError**

考慮:

+(void)fileName:(NSString *) file 

然後做:

+(NSString *) fileName; 

,並用它來完成。

如果您需要一次返回多個值,那麼需要一個結構或更經常的一個類。

在Objective-C中,通過引用來傳遞氣味,就像你做錯了一樣。


路過在Objective-C基準返回有關恢復故障,該方法的返回值本身就說明所請求的任務是否成功或失敗的NSError*信息在很大程度上保留(你可以通過NULL爲參數NSError**允許該方法優化去創建所述錯誤元數據)。

傳遞引用也用於檢索返回值實際上是一個多值的對象的內部狀態。即來自AppKit的方法如下。在這些情況下,傳遞引用參數通常是可選的或者作爲次要返回值。

它們在整個API中使用的比較少。通過引用傳遞肯定是有用的,但是 - 如上所述 - 在應用程序代碼中這樣做應該是非常罕見且罕見的。在很多情況下(以及下面的一些情況),可能的更好的模式是創建一個可以封裝狀態的類,然後返回所述類的實例而不是通過引用傳遞。

NSWorkspace.h:- (BOOL)getInfoForFile:(NSString *)fullPath application:(NSString **)appName type:(NSString **)type; 
NSTextView.h:- (void)smartInsertForString:(NSString *)pasteString replacingRange:(NSRange)charRangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString; 
NSAttributedString.h:- (BOOL)readFromURL:(NSURL *)url options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict; 
NSNib.h:- (BOOL)instantiateWithOwner:(id)owner topLevelObjects:(NSArray **)topLevelObjects NS_AVAILABLE_MAC(10_8); 
NSSpellChecker.h:- (NSRange)checkGrammarOfString:(NSString *)stringToCheck startingAt:(NSInteger)startingOffset language:(NSString *)language wrap:(BOOL)wrapFlag inSpellDocumentWithTag:(NSInteger)tag details:(NSArray **)details NS_AVAILABLE_MAC(10_5); 
+2

「在Objective-C中,通過參考氣味就像你做錯了。」你能解釋一下嗎?這樣做的缺點是什麼? – Philip007 2012-09-27 12:34:43

+2

@bbum - 如果我需要2個參數?恕我不能贊同。 – Gal 2013-06-25 12:54:24

+2

@gal你看過實際的答案嗎?如果您需要兩個參數,請使用結構或類。非常少見的是通過正確的模式來使用。 – bbum 2013-06-25 13:39:03

3

指針傳遞到您的對象是目標C(和C)通過引用傳遞的方式。

我同意'bbum':一個被認爲需要通過引用傳遞的信號是一個信號來思考你在做什麼;然而,並不是說沒有合法的理由來通過引用。

每當您有需要返回多個值的函數或方法時,您都不應該創建類。考慮爲什麼你要返回多個值,如果爲此創建一個類是有意義的,那麼就這樣做。否則,只需傳入指針即可。

- 只是我的2美分

3

試試這個

+(void)filename:(NSString **)file { 
    *[email protected]"folder_b"; 
} 

和發送文件爲&file,如:

NSString *file; 
[function fileName:&file]; 
nslog(@"%@",file); 

希望這會工作。