我正在尝试编写一个库,这样它就足够通用了。问题是它需要更新其他类的属性,属性和类都应该是动态的。
现在我可以使用公共变量做到没有问题,我只是传递一个指向我想要更新的变量的指针。然而,设置类的属性也是非常有用的,因为它们在目标C中被广泛使用。
现在,只要属性是对象类型,尝试设置基本类型属性,这也不是问题。
我当前的代码在这些行中看起来像属性:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];
然而,setArgument方法仅允许指针类型,但允许属性具有任何基本类型。有没有办法动态分配基本类型属性?
答案 0 :(得分:5)
KVO应该为您进行转换:
[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];
如果您的NSNumber
定义为:,会将myVar
转换为int
int myVar;
...
@propery (nonatomic) int myVar;
答案 1 :(得分:1)
“但是setArgument方法只允许指针类型”你错过了什么。 setArgument:
的参数不是您传递给方法的数据。它是您传递的数据(无论类型)的地址。现在,上面的代码获取对象指针的地址(它是指向指针的指针)。您可以轻松地获取整数的地址(它不关心)。换句话说,无论类型如何,您的相同确切代码都已有效:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];