【发布时间】:2014-03-11 20:11:24
【问题描述】:
我正在尝试在我使用以下代码分配的运行时类上添加和设置 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);
}
每次运行上述代码时,我都会在 object_setIvar(objectClass, ivar, [value copy]); 行收到 EXC_BAD_ACCESS (code=2, address = 0x10) 错误。我不明白为什么我会收到这个错误。在尝试设置 Ivar 的值之前,我检查了 Ivar 是否已成功添加到类中,但显然 ivar 为 nil。我尝试 NSLog ivar,但我得到了同样的错误。
我尝试在 Google 上搜索解决方案,但找不到有关 Objective-c 运行时函数的太多信息。
我正在使用 ARC 并在 iOS 模拟器上运行应用程序。
【问题讨论】:
标签: ios objective-c objective-c-runtime