2010-07-26 73 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); 

希望这会工作。