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的引用传递主要是返回保留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);
Run Code Online (Sandbox Code Playgroud)
and*_*n22 31
我相信你在寻找:
+ (void)fileName:(NSString **)file
{
*file = @"folder_b";
}
Run Code Online (Sandbox Code Playgroud)
这里真正做的是我们正在使用指向对象指针的指针.检查C(是的,只是简单的C)指南"指针取消引用"以获取更多信息.
(...但正如已经反复指出的那样,在这个特定的例子中,根本没有理由通过引用:只返回一个值.)
| 归档时间: |
|
| 查看次数: |
17706 次 |
| 最近记录: |