有人可以发布一个示例,说明我如何得到一个双倍的实例变量值?我尝试使用object_getIvar()函数,但这并不是很好,因为看起来这个函数只适用于返回对象而不是标量数据类型的变量.
/*
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)
虽然我完全赞同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**
.这是正确的,需要避免警告,并且是返回对象指针的常见用例的副作用.
但除了极少数情况外,你真的不应该在伊斯兰教中徘徊.
归档时间: |
|
查看次数: |
10663 次 |
最近记录: |