1

@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

次に、 と の 2 つの関数を見つけclass_setIvarLayoutましclass_setWeakIvarLayoutたが、 には有用な情報がありませんObjective-C Runtime Reference

では、実行時に作成されたクラスに __strong Ivar を追加するにはどうすればよいでしょうか?

4

1 に答える 1