0

次のような可変引数を受け入れるメソッドを作成しました

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

しかし、このクラス メソッドにメッセージを送信すると、呼び出されたメソッドの location 変数の値は 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];
4

1 に答える 1

0

実際、あなたのコードには明らかな欠陥が 1 つあります。可変引数関数が nil で終了する場合、受け入れられる型はオブジェクトでなければなりません。int を nil または NULL、または [NSNull null] と比較することはできません。これは、nil 終了の目的を無効にし、標準の 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];
于 2012-07-06T05:12:40.673 に答える