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 が const なのかということです。次の質問は、これをどのように修正するかです。これはここでは非常に基本的な状況であり、現在の ARC では、これを処理する方法がわかりません。

4

2 に答える 2

4

インターフェイスの説明に __autoreleasing が必要ないことを Apple ヘッダーで確認できます (つまり、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 に答える