Objective c 圆弧下保持实例变量的等价性

Objective c 圆弧下保持实例变量的等价性,objective-c,ios,memory-management,automatic-ref-counting,restkit,Objective C,Ios,Memory Management,Automatic Ref Counting,Restkit,我正在使用RestKit开发一个RESTful应用程序。我有一个包装器对象,它实际上处理请求,甚至充当RKObjectManager的委托。我遇到了一个与ARC如何处理实例变量并保留它们有关的问题,很明显,我不了解ARC是如何工作的 所以,当我这样做时,它失败了(错误与发送到解除分配实例的消息有关) MyTestClient*testClient=[[MyTestClient alloc]init] 但当我申报财产并这样做时,一切都很好: self.testClient=[[MyTestClie

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

所以,当我这样做时,它失败了(错误与发送到解除分配实例的消息有关)

MyTestClient*testClient=[[MyTestClient alloc]init]

但当我申报财产并这样做时,一切都很好:

self.testClient=[[MyTestClient alloc]init]

据我所知,在ARC下,实例变量在默认情况下总是
strong
,但它的生命周期是声明它的方法的范围


由于我无法执行
[testClient retain]
,因此我唯一可以将其设置为属性的选项是什么?

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


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

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


思考这个问题的一个简单方法是,你需要一个指向某个对象的强指针,直到你不再需要它为止。

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


就像我说的。您之所以会收到此错误,是因为testClient仅在您启动它的地方处于活动状态,即viewdidload、init或w/e

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


就像我说的。您之所以会收到此错误,是因为testClient仅在您启动它的地方处于活动状态,即viewdidload、init或w/e

好的-所以基本上,因为ARC必须对变量的范围做出某些假设,所以你需要让它们在你需要它们的任何地方都可用(无论是通过属性、成员变量等)?确切地说。ARC上有一些很好的资源。我建议你仔细阅读一下。大多数情况下,你不必担心ARC的内存问题,但它有助于理解幕后发生的事情。好吧,基本上,因为ARC必须对变量的范围做出某些假设,你需要让它们在你需要它们的任何地方都可用(是否通过属性、成员变量等)?没错。ARC上有一些很好的资源。我建议您仔细阅读。大多数情况下,您不必担心ARC的内存问题,但它有助于了解幕后发生了什么。