首页 文章

当设置为只读时,property_getAttributes()在retain,strong,weak和assign属性之间没有区别

提问于
浏览
2

我正在尝试使用 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 回答

  • 1

    我还没有尝试过你的代码,但根据

    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使用旧式编码指定类型 .

  • 2

    要快速回答您的问题,答案是否定的 .

    这里的问题是属性的内存管理语义(在ARC中为 assignunsafe_unretainedstrongweakcopy ,在MRC中为 assignretaincopy )仅在自动生成的setter代码中具有任何应用程序 . 如果您为该属性编写自己的setter,当然鼓励您自己实现语义(但不是必需的) . 这些属性的getter根本不会被这些属性属性修改 . 考虑以下代码:

    @interface FooBar ()
    @property (nonatomic, strong, readonly) NSString* foobar;
    @end
    
    @implementation FooBar
    - (NSString*) foobar {
        return [NSString stringWithFormat:@"aString"];
    }
    

    在这些情况下,调用者将生成强引用或弱引用,并且返回值必须至少与调用代码需要完成语句一样长 . 在弱引用的情况下,之后将转到 nil ,因为具有 strong 的属性不保证将为您保留引用的对象 . 最终, readonly 属性上的内存管理只不过是一个安慰剂,它最终会以习惯或风格结束 @property (nonatomic, readonly) ... 完全合法,但是当我们习惯在属性声明中遇到内存属性时会感到困惑 .

    PS:运行时中还有一个名为 property_copyAttributeList 的函数,我发现解析这些信息要容易得多(它使用结构来为你分解组件) .

相关问题