Rus*_*est 12 objective-c return-value objective-c-runtime
我必须在这里object_getInstanceVariable工作,但它似乎只适用于花车,bools和int不是双打.我确实怀疑自己做错了什么,但我一直在这么做.
float myFloatValue;
float someFloat = 2.123f;
object_getInstanceVariable(self, "someFloat", (void*)&myFloatValue);
Run Code Online (Sandbox Code Playgroud)
有效,myFloatValue = 2.123
但是当我尝试
double myDoubleValue;
double someDouble = 2.123f;
object_getInstanceVariable(self, "someDouble", (void*)&myDoubleValue);
Run Code Online (Sandbox Code Playgroud)
我得到myDoubleValue = 0.如果我尝试myDoubleValue在功能之前设置,例如.double myDoubleValue = 1.2f,当我在object_getInstanceVariable通话结束后读取它时,该值不变.myIntValue在getinstancevar上面的函数之前设置为其他值应该返回2,即.它已被改变.
然后我试了
Ivar tmpIvar = object_getInstanceVariable(self, "someDouble", (void*)&myDoubleValue);
Run Code Online (Sandbox Code Playgroud)
如果我这样做,ivar_getName(tmpIvar)我会得到"someDouble",但myDoubuleValue = 0仍然!然后我尝试ivar_getTypeEncoding(tmpIvar),我应该得到"d".
总而言之,如果typeEncoding = float,它是有效的,如果它是一个double,结果没有设置,但它正确读取变量,返回值(Ivar)也是正确的.
我必须做一些我无法看到的基本错误,所以如果有人能指出它,我会很感激.
Joh*_*eek 29
object_getInstanceVariable是一个困惑的小功能.据记载,最后一个参数是一个void **参数 - 也就是说,你传递一个void *变量的地址并得到一个指向实例变量的指针 - 但它被实现为好像它是一个void *参数 - 也就是说,你传递的是要保存实例变量副本的变量.问题是实现忽略了实例变量的大小,只是执行指针复制.所以任何与指针大小相同的东西都能完美运作.如果您运行的是32位架构,则只会复制高32位.(您也应该看到与long long实例变量相同的行为.)
解决方案是使用主API,键值编码,使用-valueForKey:.
另一个解决方案:如果你想编写一个固定版本,比如作为NSObject的类别,它看起来像这样:
@implementation NSObject (InstanceVariableForKey)
- (void *)instanceVariableForKey:(NSString *)aKey {
if (aKey) {
Ivar ivar = object_getInstanceVariable(self, [aKey UTF8String], NULL);
if (ivar) {
return (void *)((char *)self + ivar_getOffset(ivar));
}
}
return NULL;
}
@end
Run Code Online (Sandbox Code Playgroud)
然后你的代码看起来像这样:
double myDoubleValue = *(double *)[self instanceVariableForKey:@"someDouble"];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5538 次 |
| 最近记录: |