Objective-C中引用的参数

ale*_*lex 20 objective-c pass-by-reference

我试图NSString通过引用传递,但它不起作用.

这是功能:

+(void)fileName:(NSString *) file
{
    file = @"folder_b";
}
Run Code Online (Sandbox Code Playgroud)

这就是电话:

NSString *file;

[function fileName:file];

nslog(@"%@",file);    // and there is nothing in the string....
Run Code Online (Sandbox Code Playgroud)

我必须做什么来通过引用传递我的字符串?

bbu*_*bum 63

如果要返回值,则返回一个值.在Cocoa/iOS中通过引用传递主要限于NSError**.

鉴于:

+(void)fileName:(NSString *) file
Run Code Online (Sandbox Code Playgroud)

然后做:

+(NSString *) fileName;
Run Code Online (Sandbox Code Playgroud)

并完成它.

如果您需要一次返回多个值,则需要一个结构,或者更常见的是一个类.

在Objective-C中,通过引用传递气味就像你做错了.


在Objective-C的引用传递主要是返回保留NSError*有关恢复故障,该方法的返回值本身就说明所请求的任务是否成功或失败的信息(你可以传递NULLNSError**参数允许该方法优化掉创建所述错误元数据).

通过引用传递还用于检索对象的内部状态,其中返回值实际上是多值.即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);
Run Code Online (Sandbox Code Playgroud)

  • "在Objective-C中,通过引用传递的气味就像你做错了." 你能解释一下吗?这样做的不足之处是什么? (2认同)
  • @gal你读过实际答案吗?如果需要两个参数,请使用结构或类.非常非常罕见的是通过引用正确的模式来使用. (2认同)

and*_*n22 31

我相信你在寻找:

+ (void)fileName:(NSString **)file
{
  *file = @"folder_b";
}
Run Code Online (Sandbox Code Playgroud)

这里真正做的是我们正在使用指向对象指针的指针.检查C(是的,只是简单的C)指南"指针取消引用"以获取更多信息.

(...但正如已经反复指出的那样,在这个特定的例子中,根本没有理由通过引用:只返回一个值.)

  • +1然后必须将方法调用更改为[function fileName:&file] (5认同)
  • @bbum:参数*可能*是一个输入/输出参数,但即便如此... (2认同)