我试图在使用以下代码分配的运行时类上添加和设置Ivar。我没有使用Objective-C运行时函数的经验,这就是我尝试学习的原因。
if ([object isKindOfClass:[NSDictionary class]])
{
const char *className = [aName cStringUsingEncoding:NSASCIIStringEncoding];
// Allocate the class using the class name, NSObject metaclass, and a size of 0
Class objectClass = objc_allocateClassPair([NSObject class], className, 0);
// Get all of the keys in the dictionary to use as Ivars
NSDictionary *dictionaryObject = (NSDictionary *)object;
NSArray *dictionaryObjectKeys = [dictionaryObject allKeys];
for (NSString *key in dictionaryObjectKeys)
{
// Convert the NSString to a C string
const char *iVarName = [key cStringUsingEncoding:NSASCIIStringEncoding];
// Add the Ivar to the class created above using the key as the name
if (class_addIvar(objectClass, iVarName, sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*)))
{
// Get the newly create Ivar from the class created above using the key as the name
Ivar ivar = class_getInstanceVariable(objectClass, iVarName);
// Set the newly created Ivar to the value of the key
id value = dictionaryObject[key];
object_setIvar(objectClass, ivar, [value copy]);
}
}
objc_registerClassPair(objectClass);
}
每次我运行上面的代码时,都会在行上收到EXC_BAD_ACCESS(code = 2,address = 0x10)错误object_setIvar(objectClass, ivar, [value copy]);
。我不明白为什么会收到此错误。在尝试设置Ivar的值之前,我检查了Ivar是否已成功添加到类中,但是显然ivar为nil。我试过NSLog ivar,但是遇到了同样的错误。
我曾尝试在Google上搜索解决方案,但找不到关于Objective-C运行时函数的太多信息。
我正在使用ARC,并在iOS Simulator上运行该应用程序。
您不能在类上为实例变量设置值。创建并注册该类之后,您可以创建该类的实例:
id myInstance = [[objectClass alloc] init];
然后为此对象的实例变量设置值:
for (NSString *key in dictionaryObjectKeys)
{
const char *iVarName = [key cStringUsingEncoding:NSASCIIStringEncoding];
id value = dictionaryObject[key];
Ivar ivar = class_getInstanceVariable(objectClass, iVarName);
object_setIvar(myInstance, ivar, [value copy]);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句