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

ios - 是否建议为只读合成属性定义 ivars?

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

我发现很多时候我想要一个综合的只读属性,我只是根据其他变量来实现该属性的 getter 方法,而不需要 ivar,例如 (注意:我在界面中定义 ivars,因为我使用的是 OmniGraffle UML 软件,它不能识别由合成属性自动生成的 ivars):


@界面编辑器:UIView {
    BOOL _wordWrap;
    BOOL _showLineNumbers;
    NSDictionary *_options;
}

@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;

@结尾


@实现编辑器

@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize 选项 = _options;

- (NSDictionary *)options {
    返回 @{
                @"WordWrap": [NSNumber numberWithBool:self.wordWrap],
                @"ShowLineNumbers": [NSNumber numberWithBool:self.showLineNumbers],
            };
}

@结尾

在上面的 Editor 类中,我是否有必要在标题定义中定义 _options ivar 并且 more 重要的是自动- 生成的 ivar 占用符号表中的内存或空间?另外,在这种情况下使用 copyretain 还是不使用值会更有效吗?只是好奇。



Best Answer-推荐答案


首先:停止将您的 ivar 声明放在 @interface 中。它们属于您的 @implementation。见 this answer详细解释。

无论如何,鉴于您编写的内容,您的 @synthesize options = _options 无效。

@synthesize 有两种可能的效果:

  1. 如果你的类没有实例变量,它会添加一个名为 _options 的实例变量。

  2. 它会生成一个 getter 方法,options,如果你的类没有名为 options

由于您手动定义了实例变量和 getter,因此 @synthesize 什么也不做。您可以完全删除它而不改变程序的含义。

在只读属性上指定 copy 无效。 copyretain(或者,在 ARC 下更准确地说,strong)属性只影响生成的 setter 方法,编译器不会生成readonly 属性的 setter 。 (如果您在类扩展中将属性更改为 readwrite,则 copy 很重要。)

是的,_options ivar 占用了内存(对于 Editor 的每个实例)和符号表中的空间。 由于您没有使用 _options ivar,因此您应该完全删除它。您还应该完全删除 @synthesize,这样编译器就不会为您生成 _options ivar。

关于ios - 是否建议为只读合成属性定义 ivars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663176/

回复

使用道具 举报

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

本版积分规则

关注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