繁体   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