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

Ios 如何在运行时确定只读属性是否弱?,ios,iphone,objective-c,objective-c-runtime,Ios,Iphone,Objective C,Objective C Runtime,我有一个类声明了两个属性 @property (nonatomic, readonly, weak) id first; @property (nonatomic, weak) id second; 我在运行时使用以下代码检查属性的属性: unsigned int propertyCount; objc_property_t *properties = class_copyPropertyList(class, &propertyCount); for (int propertyInd

我有一个类声明了两个属性

@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);
}
显然,从文档中可以看出,第一个属性也应该有一个“W”,但它没有。有人知道如何检测这个属性实际上很弱吗

请注意,声明为弱确实很重要,编译器会关心并适当地处理它


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

将其设置为readonly只意味着您没有创建setter方法。因此,将其设置为弱,是违反直觉的。强/弱修饰符除了更改合成ivar的生存期限定符外,对只读属性没有任何区别

我会在.h中将它设置为只读,如果希望它是.m文件中的弱变量,那么

@property (nonatomic, weak) id first

这样一来,如果你想要的话,它只能从外部读取,但内部很弱。

出于好奇。。。为什么需要在运行时确定这一点?为什么能够检查对你来说很重要?我认为W代表写,我的意思是读和写。不weak@santhu访问链接,你会看到W代表弱。@micahainline我猜这是在告诉你,也许你不可能拥有一个只读且弱的属性。首先检查程序集的属性
,看看有无
weak
。@Gavin,我正在编写一个运行时验证,它需要在整个代码库中保持不变。也就是说,某些类型的类不具有指向某些其他类的强指针。基本上是自动化测试。听起来像是个麻烦事。我对该属性应该声明为什么不感兴趣。我只想知道它是什么,为什么?i、 e.通过确定这一点,我们试图实现什么?我最初的观点是,你不会声明一些只读的、弱的东西。因此,这样做会让你混淆问题,因此你会得到意想不到的结果。毕竟,它所指向的实例在某些地方必须是强的,才能存在。为了单元测试的目的,我试图通过确定在某些代码中对不变量进行运行时验证来实现这一点。人们正在创建(只读,弱)属性,当应用程序处于弱状态时,它确实会改变应用程序的运行时行为。事实上,人们将事物标记为只读,弱是有趣的,如果出于上述原因,而不是您应该如何做。我会修正代码,问是谁写的?而且不用担心测试坏代码
@property (nonatomic, weak) id first