【问题标题】:iOS memory management - clarificationsiOS 内存管理 - 说明
【发布时间】:2012-12-12 05:06:17
【问题描述】:

我知道allocretain 会增加对象的引用计数。是否有任何其他不同的方法可以实际增加引用计数?以及何时/如何调用dealloc

【问题讨论】:

    标签: objective-c ios ios5 memory-management dealloc


    【解决方案1】:
    • alloc 分配一个保留计数为 1 的对象。
    • new 开头的方法也返回一个保留计数为 1 的对象。
    • retain 将计数增加 1。
    • releaseautorelease(在运行循环结束时)将其减 1。
    • 以类名(不带前缀)开头的方法返回一个自动释放的对象,这意味着如果您自己不保留它,它将在循环结束时释放。
    • 最后,复制对象的方法(通常以copy 开头)也会创建保留计数为 1 的副本。

    dealloc 在对象的保留计数降至 0 时被调用。

    PS。如果您还不知道,请考虑使用Automatic Reference Counting (ARC)

    【讨论】:

    • 1.也添加mutableCopy,2. 不是“在运行循环的末尾”(这甚至意味着什么?),而是在封闭的自动释放池的末尾。虽然 +1。
    • @H2CO3,默认的自动释放池会在每个运行循环周期结束时释放池中的对象。但是,对于用户创建的自动释放池来说并非如此,也不应该指望它。考虑自动释放的对象可能会更好,直到作为代码一部分的最外层封闭范围结束为止(除非您明确创建了一个自动释放池,例如用于具有大量对象分配的紧密循环)。跨度>
    • @AndrewMadsen 那是 cycle 的结束,而不是运行循环的结束。
    • @H2CO3,确实,答案中的措辞并不完全正确,但似乎这就是 DrummerB 的意思。
    • @DrummerB:“我说的不是retainCount,而是retain count。” -retainCount “保留计数”。 “你不应该依赖-retainCount”意味着“你不应该依赖保留计数”
    【解决方案2】:

    有了这些,保留计数就会增加。

    1. new,不过可以看成alloc+init。

    2. 保留

    3. 复制创建新对象,保留计数=1

    4. mutableCopy 使用保留计数=1 创建新对象

    dealloc 在保留计数达到 0 时自动调用。

    【讨论】:

    • 不要 copymutableCopy 创建保留计数为 1 的新对象?它们不会增加接收者的保留计数。
    • @DrummerB:“不要复制和 mutableCopy 创建保留计数为 1 的新对象”不,不一定。他们也可以只增加接收者的保留计数。
    • @DrummerB:还有一点是,以allocnewretaincopymutableCopy 开头的方法会返回一个保留实例。调用什么对象无关紧要。
    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多