4

所以我正在做通常的事情,我将一个指向 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,我只是不确定如何处理这个问题。

4

2 回答 2

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

编译就好了。

于 2012-07-26T21:55:08.750 回答
1

这在 XCode 4.4 中对我有用:

- (BOOL) foo: (NSString*) string error: (out NSError *__autoreleasing *) outError;
于 2012-07-26T21:57:48.687 回答