从Objective-C中的对象获取Ivar值

For*_*rBR 2 objective-c

有人可以发布一个示例,说明我如何得到一个双倍的实例变量值?我尝试使用object_getIvar()函数,但这并不是很好,因为看起来这个函数只适用于返回对象而不是标量数据类型的变量.

Yuj*_*uji 12

如果您已经知道实例变量的名称,则可以使用KVC.假设具有对象x的双倍值的ivar称为"权重",NSNumber* x=[obj valueForKey:@"weight"];那么您可以获得双倍值[x doubleValue].同样,您可以设置包含double值的NSNumber num [obj setValue:num forKey:@"weight"].

object_getIvar() 是一个较低级别的东西,有助于获得类布局和/或获取你只知道名称等的ivar的类型信息.如果KVC对你不够,你能否更准确地解释你想要什么实现?


kub*_*ing 8

/*
 set
 */
Ivar ivar = class_getInstanceVariable([self class], "_rate");
((void (*)(id, Ivar, CGFloat))object_setIvar)(self, ivar, rate);

/*
 get
 */
ptrdiff_t offset = ivar_getOffset(ivar);
unsigned char* bytes = (unsigned char *)(__bridge void*)self;
CGFloat floatValue = *((CGFloat *)(bytes+offset));
Run Code Online (Sandbox Code Playgroud)


Rob*_*ier 5

虽然我完全赞同Yuji,而KVC对于绝大多数问题都是正确的方法,但这个问题也可能与此有关,为了少数情况下你真的想要在ivars中探索,答案是利用object_getInstanceVariable()这一点.例如:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MyObject : NSObject {
    double _someDouble;
}
@property double someDouble;
@end
@implementation MyObject
@synthesize someDouble=_someDouble;
@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    MyObject *object = [[MyObject alloc] init];
    object.someDouble = 3.14;
    double doubleOut;
    object_getInstanceVariable(object, "_someDouble", (void**)&doubleOut);
    NSLog(@"%f", doubleOut);
    [object release];
    [pool drain];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

需要注意的怪异投double*void**.这是正确的,需要避免警告,并且是返回对象指针的常见用例的副作用.

但除了极少数情况外,你真的不应该在伊斯兰教中徘徊.