在ARC下运行时添加__strong ivar

时间:2015-09-05 14:57:29

标签: runtime ivar strong-references

在@interface中声明的普通ivar是__strong默认值。

@interface XLPerson : NSObject {
    NSString *name; // __strong default
}
@end

现在,我在运行时创建上面的类:

Class XLPerson = objc_allocateClassPair([NSObject class], "XLPerson", 0);
size_t size = sizeof(NSString*);
class_addIvar(XLPerson, "name", size, log2(align), @encode(NSString*)));
objc_registerClass(XLPerson);

然而,名为“name”的ivar不是__strong ivar 当我使用object_setIvar()时,Ivar无法保存newValue(它将在Autorelease Pool结束时解除分配)。

id person = [[XLPerson alloc] init];
Ivar ivar = class_getInstanceVariable(XLPerson, "name");

@autoreleasepool {
   object_setIvar(person, ivar, [NSString stringWithFormat@"Stack%@", @"Overflow"]);
   // @"StackOverflow" will be deallocated. 
}
NSLog(@"%@", object_getIvar(person, ivar));
// BAD_ACCESS  *** -[CFString retain]: message sent to deallocated instance 0x1004002f0

然后我找到了两个函数class_setIvarLayoutclass_setWeakIvarLayout,但Objective-C Runtime Reference中没有任何有用的信息。

那么,如何在运行时创建的类中添加__strong Ivar?

0 个答案:

没有答案