使用object_setIvar时为EXC_BAD_ACCESS

乔纳森

我试图在使用以下代码分配的运行时类上添加和设置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上运行该应用程序。

马丁·R

您不能在上为实例变量设置值创建并注册该类之后,您可以创建该类的实例

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用泛型时为EXC_BAD_ACCESS

来自分类Dev

尝试使用object_getIvar检索值时为EXC_BAD_ACCESS

来自分类Dev

使用NativeCSS时EXC_BAD_ACCESS

来自分类Dev

Swift:观察NSUserDefaults时为EXC_BAD_ACCESS

来自分类Dev

调用ManagedObjectContext保存时为EXC_BAD_ACCESS

来自分类Dev

分配NSMutableArray时为EXC_BAD_ACCESS

来自分类Dev

捕获GPU帧时为EXC_BAD_ACCESS

来自分类Dev

重新分配GKGridGraph时为EXC_BAD_ACCESS

来自分类Dev

递归调用块时为EXC_BAD_ACCESS

来自分类Dev

使用AFNetworking 2.0执行POST时为EXC_BAD_ACCESS

来自分类Dev

使用dispatch_block_t时为EXC_BAD_ACCESS

来自分类Dev

使用cfnetwork写入输出流时,exc_bad_access

来自分类Dev

使用scrollViewDidScroll时出错EXC_BAD_ACCESS

来自分类Dev

在代码中添加UINavigationController时使用EXC_BAD_ACCESS

来自分类Dev

使用数组C ++时的“ EXC_BAD_ACCESS”

来自分类Dev

在performSelectorInBackground上为EXC_BAD_ACCESS

来自分类Dev

生成nspredicate时EXC_BAD_ACCESS

来自分类Dev

执行块时EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS 执行关闭时

来自分类Dev

使用协议组成的EXC_BAD_ACCESS

来自分类Dev

使用MPMoviePlayerViewController的EXC_BAD_ACCESS

来自分类Dev

将NSString设置为另一个时,对象为EXC_BAD_ACCESS

来自分类Dev

将std :: vector作为参数传递给函数时为EXC_BAD_ACCESS

来自分类Dev

设置选项视图属性的属性时为EXC_BAD_ACCESS

来自分类Dev

当 NSMenuItem 的目标/选择器设置为对象时,EXC_BAD_ACCESS

来自分类Dev

在Swift中使用泛型,协议和继承创建对象时使用EXC_BAD_ACCESS

来自分类Dev

在Swift中使用泛型,协议和继承创建对象时使用EXC_BAD_ACCESS

来自分类Dev

在removeFromParentNode()SceneKit处为EXC_BAD_ACCESS

来自分类Dev

Swift:glDrawElements崩溃,代码为EXC_BAD_ACCESS = 1

Related 相关文章

  1. 1

    使用泛型时为EXC_BAD_ACCESS

  2. 2

    尝试使用object_getIvar检索值时为EXC_BAD_ACCESS

  3. 3

    使用NativeCSS时EXC_BAD_ACCESS

  4. 4

    Swift:观察NSUserDefaults时为EXC_BAD_ACCESS

  5. 5

    调用ManagedObjectContext保存时为EXC_BAD_ACCESS

  6. 6

    分配NSMutableArray时为EXC_BAD_ACCESS

  7. 7

    捕获GPU帧时为EXC_BAD_ACCESS

  8. 8

    重新分配GKGridGraph时为EXC_BAD_ACCESS

  9. 9

    递归调用块时为EXC_BAD_ACCESS

  10. 10

    使用AFNetworking 2.0执行POST时为EXC_BAD_ACCESS

  11. 11

    使用dispatch_block_t时为EXC_BAD_ACCESS

  12. 12

    使用cfnetwork写入输出流时,exc_bad_access

  13. 13

    使用scrollViewDidScroll时出错EXC_BAD_ACCESS

  14. 14

    在代码中添加UINavigationController时使用EXC_BAD_ACCESS

  15. 15

    使用数组C ++时的“ EXC_BAD_ACCESS”

  16. 16

    在performSelectorInBackground上为EXC_BAD_ACCESS

  17. 17

    生成nspredicate时EXC_BAD_ACCESS

  18. 18

    执行块时EXC_BAD_ACCESS

  19. 19

    EXC_BAD_ACCESS 执行关闭时

  20. 20

    使用协议组成的EXC_BAD_ACCESS

  21. 21

    使用MPMoviePlayerViewController的EXC_BAD_ACCESS

  22. 22

    将NSString设置为另一个时,对象为EXC_BAD_ACCESS

  23. 23

    将std :: vector作为参数传递给函数时为EXC_BAD_ACCESS

  24. 24

    设置选项视图属性的属性时为EXC_BAD_ACCESS

  25. 25

    当 NSMenuItem 的目标/选择器设置为对象时,EXC_BAD_ACCESS

  26. 26

    在Swift中使用泛型,协议和继承创建对象时使用EXC_BAD_ACCESS

  27. 27

    在Swift中使用泛型,协议和继承创建对象时使用EXC_BAD_ACCESS

  28. 28

    在removeFromParentNode()SceneKit处为EXC_BAD_ACCESS

  29. 29

    Swift:glDrawElements崩溃,代码为EXC_BAD_ACCESS = 1

热门标签

归档