1
在@interface中聲明的正常ivar是__strong默認值。在ARC下運行時添加__strong ivar
@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);
然而,命名爲 「名」 伊娃是不是__strong伊娃。
當我使用object_setIvar()
時,Ivar不能保存newValue(它將在Autorelease Pool結束時解除分配)。
id person = [[XLPerson alloc] init];
Ivar ivar = class_getInstanceVariable(XLPerson, "name");
@autoreleasepool {
object_setIvar(person, ivar, [NSString [email protected]"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添加到我在運行時創建的類中?