【问题标题】:Equivalent of retaining instance variable under ARCARC下保留实例变量的等价物
【发布时间】:2012-03-19 02:51:27
【问题描述】:

我正在使用RestKit 开发一个 RESTful 应用程序。我有一个包装对象,它实际处理请求,甚至充当RKObjectManagerdelegate。我遇到了一个与 ARC 如何处理实例变量并保留它们有关的问题,我很清楚我不了解 ARC 的工作原理。

所以当我这样做时,它会失败(与发送到已释放实例的消息相关的错误)

MyTestClient *testClient = [[MyTestClient alloc] init];

但是当我声明一个属性并这样做时,一切都很好:

self.testClient = [[MyTestClient alloc] init];

据我了解,在 ARC 下,实例变量默认始终为 strong,但它的生命周期是声明它的方法的范围。

既然我做不到[testClient retain],我唯一的选择是让它成为一个属性吗?

【问题讨论】:

    标签: objective-c ios memory-management automatic-ref-counting restkit


    【解决方案1】:

    默认情况下,您的变量是强变量,并将保留在其范围内。所以在第一个例子中,对象只会被保留到函数结束。第二,因为你有一个实例变量,它会一直保留到拥有的对象被释放(在这种情况下对你来说可能足够长)。您最好的选择是将其设为属性,但您也可以将其设为实例变量。在这种情况下,它会为您做同样的事情。

    一种简单的思考方式是,您需要有一个指向对象的强指针,直到您不再需要它为止。

    【讨论】:

    • 好的 - 基本上,由于 ARC 必须对变量的范围做出某些假设,因此您需要在任何需要它们的地方(无论是通过属性、成员变量、等)?
    • 没错。 ARC 上有一些很好的资源。我建议阅读它。大多数情况下,您不必担心 ARC 的内存问题,但它有助于了解幕后发生的事情。
    【解决方案2】:

    在 ARC 中保留的等价物是有一个指向它的指针。只要您有指向该对象的东西,该对象就会保持活动状态。因此,您可以使用属性、实例变量,甚至是指向这些对象的实例。

    就像 wbyoung 说的。您收到错误是因为 testClient 仅在您启动它的地方仍然存在,这是 viewdidload 或 init 或 w/e。

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      相关资源
      最近更新 更多