Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的引用参数_Objective C_Pass By Reference - Fatal编程技术网

Objective-C中的引用参数

Objective-C中的引用参数,objective-c,pass-by-reference,Objective C,Pass By Reference,我试图通过引用传递一个NSString,但它不起作用 这就是功能: +(void)fileName:(NSString *) file { file = @"folder_b"; } 这就是电话: NSString *file; [function fileName:file]; nslog(@"%@",file); // and there is nothing in the string.... 如何通过引用传递字符串?我怀疑这是因为NSString是不可变的。你试过了

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

这就是功能:

+(void)fileName:(NSString *) file
{
    file = @"folder_b";
}
这就是电话:

NSString *file;

[function fileName:file];

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

如何通过引用传递字符串?

我怀疑这是因为NSString是不可变的。你试过了吗?

我相信你在寻找:

+ (void)fileName:(NSString **)file
{
  *file = @"folder_b";
}
这里真正要做的是使用指向对象的指针。检查C(是的,只是普通C)指南中的“指针解引用”以了解更多信息


(…但正如反复指出的,在这个特定的示例中,根本没有理由通过引用传递:只返回一个值。)

如果要返回一个值,那么返回一个值。Cocoa/iOS中的Pass-by-reference主要限于
n错误**

鉴于:

+(void)fileName:(NSString *) file
然后做:

+(NSString *) fileName;
就这样吧

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


在Objective-C中,传递引用闻起来好像你做错了。
Objective-C中的Pass by reference主要用于返回有关可恢复故障的
NSError*
信息,其中方法本身的返回值指示请求的任务是否成功(您可以将
NULL
作为
NSError**
参数传递,以允许方法优化创建所述错误元数据)

传递引用还用于检索对象的内部状态,其中返回值实际上是一个多值。例如,来自AppKit的方法如下所示。在这些情况下,传递引用参数通常是可选的或作为辅助返回值

它们在整个API中的使用非常少。当然可以使用传递引用,但是——如上所述——这样做在应用程序代码中应该非常罕见。在许多情况下——以及在下面的一些情况下——更好的模式可能是创建一个可以封装状态的类,然后返回i所述类的实例,而不是通过引用传递

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);

将指针传递给对象是通过引用传递的目标C(和C)方式

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);
我同意“bbum”的观点,即认为需要通过引用来传递信息是思考你在做什么的信号;然而,决不是没有合法理由通过引用来传递信息

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美分试试这个

+(void)filename:(NSString **)file {
     *file=@"folder_b";
}
并将文件作为
&文件
发送,如下所示:

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

希望这能起作用。

使用可变字符串无法将变量“设置”为新对象,因此在给出的示例中严格来说不起作用。但根据具体情况,这可能是最好的方法(+1)(而不是双对象ptr)一个选项是传递一个
NSMutableString
,然后使用
setString:
,但这不是“通过引用”。@andyvn:你是对的,我的观点是(通常情况下)从技术上讲,这个问题的书面答案和问题的最佳解决方案不是一回事。根本没有理由通过引用来传递这种方法。+1然后方法调用必须更改为[function fileName:&file]@bbum:参数可能是in/out参数,但即使如此。“在Objective-C中,传递引用闻起来好像你做错了。"你能解释一下吗?这样做的缺点是什么?@gal你读过实际的答案吗?如果你需要两个参数,请使用结构或类。按引用传递很少是正确的使用模式。我也不同意。将指针传递给指针只应在绝对必要时使用,因为这可能会导致奇怪的错误如果你不确定自己在做什么,就会犯错误,但正如你的回答所暗示的,这并不意味着这样做是错误的。