Обычный ivar, объявленный в @interface, является значением __strong по умолчанию.добавить __strong ivar во время выполнения под ARC
@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).
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 в свой класс, созданный во время выполнения?