所以我正在做通常我将指向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,我只是不确定如何解决这个问题。
答案 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;