3

s(、、)の呼び出しNSArraymyArrayあるとしましょうNSString@"a0"@"a1"@"a2"

次に、高速列挙で配列にループし、そのNSStringに従ってプロパティを構築します。そのプロパティへのアクセスに問題があります。

私はそのようなことを試みています:

@property (nonatomic) float a0propertyLow;
@property (nonatomic) float a0propertyHigh;
@property (nonatomic) float a1propertyLow;
@property (nonatomic) float a1propertyHigh;
..
.. etc.


for (NSString *aPos in myArray) {
    NSString *low = [NSString stringWithFormat:@"%@propertyLow",aPos];
    NSString *high = [NSString stringWithFormat:@"%@propertyHigh",aPos];
    SEL lowSel = NSSelectorFromString(low);
    SEL highSel = NSSelectorFromString(high);
    if ([self respondsToSelector:lowSel]&&[self respondsToSelector:highSel]) {
        id sumPartOne = [self performSelector:lowSel];
        id sumPartTwo = [self performSelector:highSel];
        float bla = (float)sumPartOne + (float)sumPartTwo;
    }
}

コードが間違っていることは知っていますが、それを機能させる方法がわかりません。私の問題は、lowSelとhighSelが戻るゲッターであるが、performselectorfloatメソッドがidオブジェクトに対しては問題ないがfloatsに対しては問題ないことを返すことです。

では、変数名を使用してフロートゲッターにアクセスするにはどうすればよいですか?答えは簡単なはずですが、私の心は複雑なものを探しているようです(そしてそれは明らかに機能しません)ので、私は助けを求めています:)

ご助力ありがとうございます

4

3 に答える 3

3

performSelector:スカラー値を返すメソッドを呼び出すために使用することはできません。のドキュメントperformSelector:には、あなたがしなければならないことが明確に記載されています。

オブジェクト以外のものを返すメソッドの場合は、を使用しますNSInvocation

AnNSInvocationは設定が少し複雑ですが、引数と戻り値に関してより柔軟です。

あなたの場合、代わりにKey-Valueコーディングを使用する方がおそらく簡単です。

[self valueForKey:low];

リターンタイプを考慮に入れて、を自動的にラップしfloatますNSNumber

于 2012-05-13T12:51:12.593 に答える
1

これらのgetterメソッドを本当に使用する必要がある場合は、プロパティをに変更してdoubleobjc_msgSend_fpret()を使用できます。

#include <objc/runtime.h>
#include <objc/message.h>

double arg0 = objc_msgSend_fpret(self, lowSel);

ゲッターを回避でき(これは良い習慣ではありませんが、とにかく、次の方法で確実に機能します)、インスタンス変数を直接使用できます。

void *object_getIvarPtr(id obj, const char *name)
{
    if (!obj || !name)
    {
        return NULL;
    }

    Ivar ivar = object_getInstanceVariable(obj, name, NULL);

    if (!ivar)
    {
        return NULL;
    }

    return ((char *)obj + ivar_getOffset(ivar));
}

float arg0 = *(float *)object_getIvarPtr(self, [lowSel UTF8String]);

お役に立てれば。

于 2012-05-13T12:51:31.147 に答える
-1

実行できる1つの方法は、実行時にフロートを次のようなオブジェクトに変換することです。

NSString *str=[NSSTring stringWithFormat:@"%f",yourFloatValue];

その後、uを使用してそれを取得できます

[str floatValue];
于 2012-05-13T12:55:22.190 に答える