在ARC中输出参数Objective C

问题描述:

我是新来的目标C,并且我不知道如何在使用新的ARC编译器编译代码时创建和调用带out参数的方法。在ARC中输出参数Objective C

这是我试图在非ARC目标C中完成的事情(这可能是错误的)。

// 
// Dummy.m 
// OutParamTest 

#import "Dummy.h" 

@implementation Dummy 

- (void) foo { 
    NSString* a = nil; 
    [self barOutString:&a]; 
    NSLog(@"%@", a); 
} 

- (void) barOutString:(NSString * __autoreleasing *)myString { 
    NSString* foo = [[NSString alloc] initWithString:@"hello"]; 
    *myString = foo; 
} 

@end 

(编辑以符合建议)。

我读过这里的文档: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

这里: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

...但我发现很难得到任何东西,编译,别提什么,是正确的。任何人都可以用适合于ARC目标C的方式重写上面代码的jist?

+0

究竟是什么问题?你得到什么编译器错误? –

+0

我已经使用您的建议更新了上面的代码示例,并且包含了一组编译器错误。谢谢。 – Ben

+0

查看我的更新回答。正如编译器所说的,你不能使用这样的间接指针,而必须直接传入'&a'。 –

您需要使用的输出参数的__autoreleasing属性:

- (void) barOutString:(NSString * __autoreleasing *)myString { 
    NSString* foo = [[NSString alloc] initWithString:@"hello"]; 
    *myString = foo; 
} 

预发布文档(这我不能链接到由于NDA)放__autoreleasing两个“中间*的,但它可能只是作为(__autoreleasing NSString **)

您也不能使用间接双指针(b)在您的原始代码中。您必须使用这种形式:

- (void) foo { 
    NSString* a = nil; 
    [self barOutString:&a]; 
    NSLog(@"%@", a); 
} 

您也是一个对象,它是完全错误的调用dealloc直接。我建议你阅读内存管理指南。

+1

第一种方法有一个小错误。 '* myString = &foo;'应改为'* myString = foo;'。 – diegoreymendez

+1

谢谢,修正。不知道那是怎么回事。 –