在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
...但我发现很难得到任何东西,编译,别提什么,是正确的。任何人都可以用适合于ARC目标C的方式重写上面代码的jist?
您需要使用的输出参数的__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
直接。我建议你阅读内存管理指南。
第一种方法有一个小错误。 '* myString = &foo;'应改为'* myString = foo;'。 – diegoreymendez
谢谢,修正。不知道那是怎么回事。 –
究竟是什么问题?你得到什么编译器错误? –
我已经使用您的建议更新了上面的代码示例,并且包含了一组编译器错误。谢谢。 – Ben
查看我的更新回答。正如编译器所说的,你不能使用这样的间接指针,而必须直接传入'&a'。 –