Objective c iOS\uuuu自动释放常数错误

Objective c iOS\uuuu自动释放常数错误,objective-c,ios,automatic-ref-counting,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:&er

所以我做的通常是,我将指向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

所以我真正的问题是为什么我的N错误是常量?我的下一个问题是如何解决这个问题?这是一个非常基本的情况,现在使用ARC,我不知道如何处理这个问题。

您可以在Apple标题中看到,在接口描述中不需要自动删除(即查看NSFileManager AttributesOfficeSystemForPath的标题文件)。因此,请使用:

而不是

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

编译很好。

这在XCode 4.4中对我很有用:

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

这很奇怪。它不会让我这么做的。即使我将参数名称更改为其他名称,如果它看到一个NSError指针进入,它也不允许,并且给出了原始错误。您更改了接口和实现,对吗?我现在将在一个示例项目中测试它……我刚刚构建了一个类似的项目,它运行良好。不知何故,我肯定错过了什么,但我看不出是什么。我会再看看。。。哦,我甚至没有使用uu自动删除,它仍然编译没有错误。我想整个画面是必要的:-)这是在一个块中。声明_block NSError*error=nil;修正了当源代码在ARC中时,自动释放是必要的。没有收到任何错误的原因是,没有在函数-foo中为作为参数传递的双指针指定任何错误值。我使用的是4.3.3,这不会改变任何内容。我必须在这里做些什么,我不敢相信这不是一个大问题,但我在谷歌上几乎找不到任何东西。
- (BOOL) foo: (NSString*) string error: (out NSError *__autoreleasing *) outError;