【问题标题】:Does Using Assign reduce the amount of memory used?使用分配是否会减少使用的内存量?
【发布时间】:2014-09-03 12:22:47
【问题描述】:

当我在声明合成属性时使用assign 时,ARC 是否仍会自动为其创建匹配的 ivar?我的财产如下

@property (nonatomic, assign) NSString *text:

- (NSString *)text {
    return self.label.text; // label is a UILabel
}

- (void)setText:(NSString *)text {
    self.label.text = text;
}

我从来没有使用过自动生成的_text ivar;当我省略 @synthesize text = _text 时,编译器是否仍会创建此 ivar,或者未使用的 ivar 是否仅保留在未使用的内存中?

【问题讨论】:

    标签: ios objective-c memory-management ivars


    【解决方案1】:

    不要以这种方式使用assign。在这种特殊情况下它可能无关紧要,但它会让调用者非常困惑,如果你更改实现,它会产生非常糟糕的错误。

    您实现了 getter 和 setter 的事实意味着编译器不会生成 ivar。这与您使用的内存管理属性无关。在这里使用strong,因为这就是您实现的。您的标头应与您的实现相匹配。

    【讨论】:

    • 但是ivar不会还在符号表中出现吗?
    • 不应该。你看到一个吗?一个更好的问题是它是否会出现在来自class_copyIvarList() 的 ivars 列表中,但它也不应该在那里。如果是,您应该打开一个编译器缺陷。您还可以查看程序集输出(在助手编辑器窗格中选择“Assembler”)并亲自查看。它不应该在那里。
    • 您还可以通过尝试访问self._text 来更简单地向自己证明这一点。这应该无法编译。
    • 强执行是什么意思?分配实现是什么样的?
    • strong 实现保留新值并释放旧值。 assign 实现不进行内存管理。
    【解决方案2】:

    仅当您自己没有实现属性时,才会自动为您创建 ivar。 @synthesize text = _text; 会自动完成,除非您为 getter 和 setter 提供自己的实现,或者将属性综合到其他变量。例如:

    @synthesize text;
    

    以上将text属性合成为text变量。

    至于使用assign而不是复制,理论上会使用更少的内存,但同时也很危险。如果你使用可变字符串,如果你将字符串赋值给一个属性后改变了字符串值,那么属性值也会改变,这在大多数情况下不是你想要的。

    【讨论】:

    • "除非您为 getter 和 setter 提供自己的实现。"他确实实现了getter和setter。不会创建 ivar。
    【解决方案3】:

    您是否担心每个实例有 4-8(32/64 位指针)字节的额外分配?使用 assign、weak 或 strong strong 不会改变内存占用。无论您使用什么字符串,都不会复制引用始终指向同一个实例。不同之处仅在于 assig、weak 不会增加对象的引用计数,因此通过省略 ivar,您只能“节省”4-8 个字节,具体取决于您使用的架构。

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 2014-02-02
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2021-07-18
      相关资源
      最近更新 更多