【问题标题】:How do you release objects that are off screen on iOS with ARC?如何使用 ARC 在 iOS 上释放屏幕外的对象?
【发布时间】:2026-01-22 15:55:02
【问题描述】:

我将一些 UIButtons 移出屏幕,当我浏览子视图时我仍然可以枚举它们。我想“释放”它们以使脚本运行得更快,但是如何在带有 ARC 的 iOS 上做到这一点?

【问题讨论】:

    标签: ios automatic-ref-counting


    【解决方案1】:

    当您在 ARC 下时,“释放”对象所需要做的就是将对其的所有引用设置为 nil

    在您的情况下,除非您将所有这些 UIButtons 保存在数组或某处,否则您只需在它们不在屏幕时将它们从超级视图中删除。当然,如果你以后再次需要它们,你将不得不重新添加它们

    【讨论】:

    • 实际上我只是尝试设置 button = nil ,但我收到一条错误消息,提示我需要声明它为 strong 以允许这样做。我该怎么做?
    • @minjiera 现在如何声明按钮?
    • 我在一个函数中创建了它们。当用户对屏幕进行操作时,会多次调用此函数。但 ARC 会保留它们,直到我改变观点...
    • 如果你没有其他引用它,那么你只需要从superview中删除它,正如Jody在下面指出的那样
    【解决方案2】:

    使用 ARC,您不能调用 dealloc、release 或 retain,尽管您仍然可以保留和释放 CoreFoundation 对象。遗憾的是,您在使用 ARC 时无法手动释放对象。您尝试过弱引用还是强引用对象?

    【讨论】:

      【解决方案3】:

      我怀疑你会看到任何性能影响,除非你有很多按钮,或者你的枚举块每个按钮都需要大量时间。

      无论如何,您可以使用...从它的超级视图中删除任何元素...

      [view removeFromSuperView];
      

      【讨论】:

        【解决方案4】:

        感谢您的所有回复,但我的问题的正确答案(在发布实例对象时。我应该把它放在问题中......对不起,伙计们)如下:

        for (int x =0; x<[toBeDeletedArray count]; x++) {
             UIButton* __weak butt = (UIButton*)[toBeDeletedArray objectAtIndex:x];
             [butt removeFromSuperview];
             butt = nil;
             }
        

        关键是声明为“__weak”,然后设置为nil即可。

        感谢您的所有灵感!

        【讨论】:

          最近更新 更多