簡體   English   中英

Objective-C中引用的參數

[英]Arguments by reference in Objective-C

我試圖通過引用傳遞NSString但它不起作用。

這是功能:

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

這就是電話:

NSString *file;

[function fileName:file];

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

我必須做什么來通過引用傳遞我的字符串?

如果要返回值,則返回一個值 在Cocoa / iOS中通過引用傳遞主要限於NSError**

鑒於:

+(void)fileName:(NSString *) file

然后做:

+(NSString *) fileName;

並完成它。

如果您需要一次返回多個值,則需要一個結構,或者更常見的是一個類。

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


Objective-C中的引用傳遞主要用於返回有關可恢復故障的NSError*信息,其中方法的返回值指示所請求的任務是成功還是失敗(您可以將NULL作為NSError**參數傳遞給允許該方法優化遠離創建所述錯誤元數據)。

通過引用傳遞還用於檢索對象的內部狀態,其中返回值實際上是多值。 即AppKit中的方法如下。 在這些情況下,pass-by-reference參數通常是可選的或充當輔助返回值。

它們在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);

我相信你在尋找:

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

這里真正做的是我們正在使用指向對象指針的指針 檢查C(是的,只是簡單的C)指南“指針取消引用”以獲取更多信息。

(...但正如已經反復指出的那樣,在這個特定的例子中,根本沒有理由通過引用:只返回一個值。)

嘗試這個

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

並將文件作為&file發送,如:

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

希望這會奏效。

將指針傳遞給對象是通過引用傳遞的Objective C(和C)方式。

我同意'bbum'認為需要通過引用傳遞是一個信號來思考你在做什么; 但是,絕不是沒有合理理由通過引用傳遞的情況。

每次有一個需要返回多個值的函數或方法時,都不應該無所事事地創建類。 考慮為什么要返回多個值,如果為此創建一個類是有意義的,那么這樣做。 否則,只需傳入指針即可。

- 我的2美分

我懷疑這是因為NSString是不可變的。 你試過NSMutableString嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM