Как свойство для вызова reallySetProperty

#ios #objective-c

#iOS #objective-c

Вопрос:

У меня есть некоторый код, подобный этому:

 @interface Person : NSObject
@property (atomic, copy) NSString* cjmName;
@property (atomic, strong) NSNumber *cjmAge;

@end

@implementation Person

@synthesize cjmName = _cjmName;
@synthesize cjmAge = _cjmAge;

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [[Person alloc] init];
        p.cjmName = @"J";
        p.cjmAge = @22;
    }
    return 0;
}
  

Когда я использую clang для перевода их в .cpp код, у меня есть это:

 // @synthesize cjmName = _cjmName;
extern "C" __declspec(dllimport) id objc_getProperty(id, SEL, long, bool);

static NSString * _I_Person_cjmName(Person * self, SEL _cmd) {
    typedef NSString * _TYPE;
    return (_TYPE)objc_getProperty(self, _cmd, __OFFSETOFIVAR__(struct Person, _cjmName), 1);
}
extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);

static void _I_Person_setCjmName_(Person * self, SEL _cmd, NSString *cjmName) {
    objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct Person, _cjmName), (id)cjmName, 1, 1);
}

// @synthesize cjmAge = _cjmAge;
static NSNumber * _I_Person_cjmAge(Person * self, SEL _cmd) {
    return (*(NSNumber **)((char *)self   OBJC_IVAR_$_Person$_cjmAge));
}
static void _I_Person_setCjmAge_(Person * self, SEL _cmd, NSNumber *cjmAge) {
    (*(NSNumber **)((char *)self   OBJC_IVAR_$_Person$_cjmAge)) = cjmAge;
}
  

Я хочу знать, почему proprety(atomic,strong) не вызывается objc_setProprety , если оно не вызывает objc_setProprety или другую подобную функцию objc_setProprety_atomic , как оно может вызывать reallySetProperty и блокировать function setCjmAge .

Спасибо всем, кто мне помогает.