• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 19:10:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个声明两个属性的类。

@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 T@,R,N,V_first.  Weak? 0
attributes of property are T@,W,N,V_second.  Weak? 1

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtpropertyintrospection.html 的文档中可以清楚地看出第一个属性也应该有一个“W”,但它没有。有谁知道如何检测这个属性实际上很弱?

请注意,将它声明为弱确实很重要,编译器会关心并适本地对待它。

这似乎是一个错误,但我仍然需要一个真正有效的方法。



Best Answer-推荐答案


将其设置为只读仅意味着您没有创建 setter 方法。所以将其设置为弱,是违反直觉的。除了更改合成 ivar 的生命周期限定符之外,强/弱修饰符对只读属性没有任何影响

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

@property (nonatomic, weak) id first

这样它在外部是只读的,但如果这是你想要的,那么它在内部是弱的。

关于ios - 如何在运行时确定只读属性是否弱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21941418/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap