@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(它将在自动释放池结束时被释放)。
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_setIvarLayout
和class_setWeakIvarLayout
,但是里面没有任何有用的信息Objective-C Runtime Reference
。
那么,如何在运行时创建的类中添加 __strong Ivar?