我正在尝试使用 property_getAttributes() 运行时函数获取对象的属性属性 . 某些属性设置为 read-only . 但是当我尝试在retain / strong,weak和assign属性之间做出区分时,就出现了问题 . 例如 . :
假设我们有:
@interface MyObject : NSObject
@property (assign, readonly) NSObject *prop1;
@property (strong, readonly) NSObject *prop2;
@property (weak, readonly) NSObject *prop3;
@end
我们得到了 property 清单并打印出来
int outCount;
objc_property_t *properties = class_copyPropertyList([MyObject class], &outCount);
for(i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
const char *c_attributes = property_getAttributes(property);
printf("%s", c_attributes);
}
free(properties);
结果是:
T@"NSObject",R,V_prop1
T@"NSObject",R,V_prop2
T@"NSObject",R,V_prop3
...所以没有特定的代码,弱,强/保留,当它们是只读时分配属性:(
The question is :有没有其他方法可以知道 property 是否弱,强/保留,分配?
2 回答
我还没有尝试过你的代码,但根据
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtpropertyintrospection.html
R该属性是只读的(只读)
C该属性是最后分配的值(副本)的副本 .
&该属性是对最后分配的值的引用(保留) .
N该属性是非原子的(非原子的) .
G该属性定义了一个自定义的getter选择器名称 . 名称跟随G(例如,GcustomGetter) .
S该属性定义自定义setter选择器名称 . 名称跟随S(例如,ScustomSetter:,) .
D属性是动态的(@dynamic) .
W属性是弱引用(__weak) .
P该 properties 有资格进行垃圾收集 .
t使用旧式编码指定类型 .
要快速回答您的问题,答案是否定的 .
这里的问题是属性的内存管理语义(在ARC中为
assign
,unsafe_unretained
,strong
,weak
,copy
,在MRC中为assign
,retain
,copy
)仅在自动生成的setter代码中具有任何应用程序 . 如果您为该属性编写自己的setter,当然鼓励您自己实现语义(但不是必需的) . 这些属性的getter根本不会被这些属性属性修改 . 考虑以下代码:在这些情况下,调用者将生成强引用或弱引用,并且返回值必须至少与调用代码需要完成语句一样长 . 在弱引用的情况下,之后将转到
nil
,因为具有strong
的属性不保证将为您保留引用的对象 . 最终,readonly
属性上的内存管理只不过是一个安慰剂,它最终会以习惯或风格结束@property (nonatomic, readonly) ...
完全合法,但是当我们习惯在属性声明中遇到内存属性时会感到困惑 .PS:运行时中还有一个名为
property_copyAttributeList
的函数,我发现解析这些信息要容易得多(它使用结构来为你分解组件) .