2012-07-26 42 views
4

所以我做的是平時在那裏我傳遞一個指針NSError對象的方法。它曾經是一個簡單的:的iOS __autoreleasing常量錯誤

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

您可以在蘋果頭看,沒有必要在接口描述的__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); 

編譯就好了。

+0

這是奇怪的。它不會讓我這樣做。即使我改變參數名稱別的東西,如果它看到一個NSError指針進來的,它不會允許它,並給我原來的錯誤。 – mickm 2012-07-26 22:34:27

+0

你改變了界面和實現,對吧?我會去一個示例項目現在測試它... – 2012-07-26 23:24:51

+0

我剛剛建立了一個類似的項目,並能正常工作。不知何故,我必須失去一些東西,但我看不到它是什麼。我會看更多...哦,我甚至沒有使用__autoreleasing,它仍然編譯沒有錯誤。 – mickm 2012-07-27 18:37:52

1

這工作對我的XCode 4.4:

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

我在4.3.3上,這並沒有改變任何東西。我必須在這裏做點什麼,我不能相信這不是一個大問題,但我幾乎沒有發現任何事情。 – mickm 2012-07-26 22:36:58