[英]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中的引用传递主要用于返回有关可恢复故障的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.