iOS __autoreleasing const错误

时间:2012-07-26 21:47:38

标签: objective-c ios automatic-ref-counting

所以我正在做通常我将指向NSError对象的指针传递给方法的地方。过去很简单:

-(BOOL)foo:(NSString *)string error:(NSError **)error

但现在使用ARC:

-(BOOL)foo:(NSString *)string error:(NSError *__autoreleasing *)error

所以,如果我有一个变量:

NSError *error = nil;

并尝试:

[foo:@"a string" error:&error];

我收到了错误:

Sending 'NSError const __strong*' to parameter of type 'NSError *__autoreleasing*' changes retain/release properties of pointer.

这很好,即使我的印象是编译器会为你处理这个问题。所以我犯了错误:

__autoreleasing NSError *error = nil;

我收到警告:

Sending 'NSError *__autoreleasing const *' to parameter of type 'NSError *__autoreleasing*' discards qualifier

所以我真正的问题是为什么我的NSError是一个常量?我的下一个问题是如何解决这个问题?这是一个非常基本的情况,现在有了ARC,我只是不确定如何解决这个问题。

2 个答案:

答案 0 :(得分:4)

您可以在Apple标题中看到,界面描述中不需要__autoreleasing(即查看NSFileManager attributesOfFileSystemForPath的头文件)。所以使用:

(NSError **)

而不是

(NSError *__autoreleasing *)

编辑:我有一个我玩的示例项目,其中启用了ARC,我只是做了这个没有问题:

-(BOOL)foo:(NSString *)string error:(NSError **)error
{
    return YES;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    __autoreleasing NSError *err = nil;
    [self foo:@"glop" error:&err];
    NSLog(@"%@", err);

编译得很好。

答案 1 :(得分:1)

这适用于XCode 4.4:

- (BOOL) foo: (NSString*) string error: (out NSError *__autoreleasing *) outError;