3

假设我有NSArray一个s ( myArray, , )NSString@"a0"@"a1"@"a2"

然后在快速枚举中,我循环进入我的数组以根据该 NSStrings 构建属性。我在访问该属性时遇到问题。

我正在尝试这样的事情:

@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 是返回的 getter,float但是执行选择器方法返回的方法id对对象来说是可以的,但对 s 来说是不行float的。

那么,如何使用变量名访问我的浮动吸气剂?我敢肯定答案一定很简单,但似乎我的大脑正在寻找一些复杂的东西(而且这显然不起作用)所以我正在寻求帮助:)

非常感谢您的帮助

4

3 回答 3

3

您不能performSelector:用来调用返回标量值的方法。文档performSelector:清楚地说明了您必须做什么:

对于返回对象以外的任何内容的方法,请使用NSInvocation.

AnNSInvocation设置起来有点复杂,但在参数和返回类型方面更灵活。

在您的情况下,使用键值编码可能更容易:

[self valueForKey:low];

将返回类型考虑在内,并会自动floatNSNumber.

于 2012-05-13T12:51:12.593 回答
1

如果您确实需要使用这些 getter 方法,可以将属性更改为double并使用 objc_msgSend_fpret():

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

double arg0 = objc_msgSend_fpret(self, lowSel);

如果您可以避免 getter(我知道,这不是一个好习惯,但无论如何,它肯定适用于以下方法),并直接使用实例变量:

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

您可以做的一种方法是在运行时将您的浮点数转换为对象,例如:-

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

然后你可以使用它来检索它

[str floatValue];
于 2012-05-13T12:55:22.190 回答