如何在运行时确定只读属性是否较弱?

问题描述:

我有一个声明两个属性的类。如何在运行时确定只读属性是否较弱?

@property (nonatomic, readonly, weak) id first; 
@property (nonatomic, weak) id second; 

我用下面的代码在运行时检查属性的特性:

unsigned int propertyCount; 
objc_property_t *properties = class_copyPropertyList(class, &propertyCount); 
for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) { 
    objc_property_t property = properties[propertyIndex]; 
    const char *rawName = property_getName(property); 
    NSString *propertyName = [NSString stringWithCString:rawName encoding:[NSString defaultCStringEncoding]]; 
    BOOL isWeak = [self propertyIsWeak:property]; 
    char const *attributes = property_getAttributes(property); 
    NSString *attributesString = [NSString stringWithCString:attributes encoding:[NSString defaultCStringEncoding]]; 
    NSArray *attributesArray = [attributesString componentsSeparatedByString:@","]; 
    BOOL weak = [attributesArray containsObject:@"W"]; 
    NSLog(@"attributes of property are %@. Weak? %d", attributesString, weak); 
} 

不幸的是,我得到这些结果:

attributes of property are [email protected],R,N,V_first. Weak? 0 
attributes of property are [email protected],W,N,V_second. Weak? 1 
从文档

显然在https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtpropertyintrospection.html的第一个属性也应该有'W',但它不会。有谁知道如何检测到这个属性实际上很弱?

请注意,它确实很重要,它被声明为弱,编译器会关心并正确处理它。

这看起来像一个错误,但我仍然需要一个实际工作的方法。

+4

出于好奇......为什么你需要在运行时确定这一点?为什么这对你能够检查很重要? – Gavin

+0

我想W在这里代表写,我的意思是读写。不弱 – santhu

+1

@santhu访问链接,你会看到W代表弱。和@MicahHainline我猜这是告诉你,也许你不能拥有一个只读和虚弱的财产。查看程序集的属性'first',看看代码中有没有区别,有无弱代码。 – Gavin

通过将其设置为只读,仅表示您未创建setter方法。所以把它设置为弱,是违反直觉的。除了改变合成ivar的使用寿命限定符之外,强/弱修改器对只读属性没有任何影响

我会在.h中将其设置为Readonly,然后如果您希望它成为弱变量.m文件里面有

@property (nonatomic, weak) id first 

这种方式是只读的外部,但内部弱,如果这是你想要的。

+0

我对什么属性应声明为不感兴趣。我只是想检测它是什么。 –

+1

为什么?即正在试图通过确定?我的原始观点是你不会宣布任何只读,虚弱的东西。因此,通过这样做,你会混淆问题,因此你会得到不可预期的结果。毕竟它指向的所有实例都必须是强大的,才能存在。 – AppHandwerker

+0

我已经更新了我的原始答案,以便更明确一点 – AppHandwerker