2011-05-29 75 views
2

我的核心數據讀一本書,在某些時候筆者有此驗證方法使用一個或多個星號:困惑在Objective-C

- (BOOL)validateRadius:(id *)ioValue error:(NSError **)outError { 
    NSLog(@"Validating radius using custom method"); 

    if ([*ioValue floatValue] < 7.0 || [*ioValue floatValue] > 10.0) { 
     // Fill out the error object 
     if (outError != NULL) { 
      NSString *msg = @"Radius must be between 7.0 and 10.0"; 
      NSDictionary *dict = [NSDictionary dictionaryWithObject:msg forKey:NSLocalizedDescriptionKey]; 
      NSError *error = [[[NSError alloc] initWithDomain:@"Shapes" code:10 userInfo: dict] autorelease]; 
      *outError = error; 
     } 
     return NO; 
    } 
    return YES; 
} 

有跡象表明,讓我困惑了兩件事因爲我甚至不知道他們在技術上被稱爲什麼,似乎無法在Google中找到。

首先一個是在該方法的簽名中使用兩個星號的**

- (BOOL)validateRadius:(id *)ioValue error:(NSError **)outError { 

第二個是使用單個星號*的當上的方法調用的reciever:

[*ioValue floatValue] 

我之前沒有看到這兩件事情,所以我想知道他們是關於什麼的。剛剛6個月前開始iOS編程。

任何對在線文檔的解釋或指示都非常受歡迎。

+0

考慮'* outError =錯誤;'這說明了爲什麼「傳遞指針指針」('**')是有用的。 – 2011-05-29 22:31:22

回答

3

(id *)ioValue意味着ioValue指針爲一個id,而不是id本身。表達式*ioValue指的是ioValue指向的id。

(NSError **)outError意味着outError是指向NSError *(這又是指向NSError的指針)的指針。

以這種方式傳遞指向函數的指針的通常原因是允許函數將某些內容返回給調用者。

在上述情況下,函數可能會將新的id分配給調用者傳入的變量:*ioValue = something()。但是,由於上述功能實際上並未這樣做,因此似乎是多餘的;它可能被寫爲(id)ioValue,然後將其稱爲ioValue而不是*ioValue

但是,outError的情況非常合理。如果發生錯誤,函數會創建一個錯誤對象(NSError *error = ...)並將其分配給傳入的變量:*outError = error。這具有改變原始變量的效果,即調用者傳遞的,這樣,當該函數返回時,主叫方可以檢查該變量看這是所產生的誤差:

id ioValue = something(); 
IOError *err; 
if ([foo validateRadius:&ioValue error:&err]) { 
    NSLog("Yippee!"); 
} else { 
    reportError(err); 
} 
+0

+1但是我認爲這應該解釋'* outError = error;'和它爲什麼可以工作(沒有它,'NSError **'幾乎就是愚蠢的)。 – 2011-05-29 22:33:16

+0

@pst:同意。我懷疑你在修改我的答案時添加了你的評論。 – 2011-05-29 22:39:13