如何在运行时确定只读属性是否较弱?
我有一个声明两个属性的类。如何在运行时确定只读属性是否较弱?
@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',但它不会。有谁知道如何检测到这个属性实际上很弱?
请注意,它确实很重要,它被声明为弱,编译器会关心并正确处理它。
这看起来像一个错误,但我仍然需要一个实际工作的方法。
通过将其设置为只读,仅表示您未创建setter方法。所以把它设置为弱,是违反直觉的。除了改变合成ivar的使用寿命限定符之外,强/弱修改器对只读属性没有任何影响
我会在.h中将其设置为Readonly,然后如果您希望它成为弱变量.m文件里面有
@property (nonatomic, weak) id first
这种方式是只读的外部,但内部弱,如果这是你想要的。
我对什么属性应声明为不感兴趣。我只是想检测它是什么。 –
为什么?即正在试图通过确定?我的原始观点是你不会宣布任何只读,虚弱的东西。因此,通过这样做,你会混淆问题,因此你会得到不可预期的结果。毕竟它指向的所有实例都必须是强大的,才能存在。 – AppHandwerker
我已经更新了我的原始答案,以便更明确一点 – AppHandwerker
出于好奇......为什么你需要在运行时确定这一点?为什么这对你能够检查很重要? – Gavin
我想W在这里代表写,我的意思是读写。不弱 – santhu
@santhu访问链接,你会看到W代表弱。和@MicahHainline我猜这是告诉你,也许你不能拥有一个只读和虚弱的财产。查看程序集的属性'first',看看代码中有没有区别,有无弱代码。 – Gavin