2012-07-06 101 views
0

我已經創建了一個接受可變參數一樣Variadic args。如何可變參數ARGS傳遞給

- (NSDictionary *) getImagePixelsAtLocation: (int) locations,...NS_REQUIRES_NIL_TERMINATION 

但是當我將消息發送到這個類的方法,在調用方法的變量位置值爲0的方法等(它無論我通過多少次論證)。

該方法接收標量數據類型。我的問題是:我們可以將標量變量作爲可變參數傳遞給方法嗎?如果是的話,我做錯了什麼?

的方法定義是:

- (NSDictionary *) getImagePixelsAtLocation: (int) pixel1,... 
{ 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    va_list args; 
    va_start(args, pixel1); 

    //processing logic 


    va_end(args); 
} 

這是怎麼了,我發短信:

[HSImageProcessing getImagePixelsAtLocation:1,2,nil]; 
+0

u能請添加方法聲明或全法碼。 – 2012-07-06 04:34:18

+0

我剛剛測試過,它對我來說工作得很好。順便說一句,將nil傳遞給期望int的東西沒有多大意義。 – 2012-07-06 04:47:42

+0

如果您擔心它,只需將參數類型更改爲接受NSIntegers。 – CodaFi 2012-07-06 04:53:52

回答

0

其實,有你的代碼中有一個昭然若揭的缺陷:當一個可變參數函數是零終止的,接受的類型必須是一個對象。你不能將int與nil或NULL或[NSNull null]進行比較,這會破壞nil-termination的目的,並且使用標準for和for-in循環有效地擊敗所有迭代機會。另外,NSDictionary對於存儲非對象類型並不太樂意,並且會很樂意讓編譯器抱怨。我已經重寫它接受NSNumber *,並輸出一個數字字典。

- (NSDictionary*) getImagePixelsAtLocation: (NSNumber*) pixel1,... 
{ 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    va_list args; 
    va_start(args, pixel1); 

    //processing logic 
    for (NSNumber* arg = pixel1; arg != nil; arg = va_arg(args, NSNumber*)) { 
     [dict setObject:arg forKey:[NSString stringWithFormat:@"%i", [arg intValue]]]; 
    } 

    va_end(args); 
    return dict; 
} 

它所需要的是額外的代碼在你的部分一點點地得到那個非常相同的呼叫工作,以及:

[self getImagePixelsAtLocation:[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],nil]; 
+0

而且這個醜陋的代碼將會變得更乾淨[http://clang.llvm.org/docs/ObjectiveCLiterals.html]:'[self getImagePixelsAtLocation:@ 1,@ 2,nil]'。或者,[你可以*用'int's](http://en.wikipedia.org/wiki/Stdarg.h)來做到這一點,但是你需要終止零(或'INT_MAX',或者您選擇的其他一些哨點值)。 – rickster 2012-07-06 05:19:16

+0

以零結尾是危險的,因爲可能通過的結果實際上是零。另外,零是***不是零,***是爲id類型。另外,你對文字的理解是完全正確的,但是我想在我跳入2.1之前儘可能長時間地保持ObjC 2.0的氣味; P(也就是說,他可能無法訪問Xcode 4.5 ......) – CodaFi 2012-07-06 05:20:46

相關問題