将对象分配给本地对象会增加目标C中的保留计数

时间:2013-02-18 06:02:08

标签: objective-c cocoa-touch object memory-management retain

我需要对以下代码做一些澄清。

我有一个包含ClassA对象的数组。然后我检索其中一个对象并将其分配给局部变量object1。

 ClassA object1 = [ClassAObjectContainer objectAtIndex:0];

(问题1 - 这种增加会保留计数吗?我认为不是这样)

现在我删除了对象

  [ClassAObjectContainer removeObjectAtIndex:0];

(问题2 - 所以现在对象1指向解除分配的实例??如果我向它发送消息它会崩溃吗?

所以我应该使用ClassA object1 = [[ClassAObjectContainer objectAtIndex:0] retain];如果我想保持对象存活并在以后使用它。

另一件事,当从方法返回对象时哪一个更好的方法

- (ClassA *)calle
{
    ClassA *object1 = [[ClassA alloc] init];
    return [object1 autorelease];
}

- (void)Caller
{
    ClassA *object2 = [self calle];
    //now suppose object1 is auto-released, so in this case object2 points to deallocated instance?
}

所以不应该更好 -

- (void)CallerMethod
{
    ClassA *object2 = [[self calle] retain];
   // Do other works.
   /.....

    [object2 release];
}

在这种情况下发生的事情,

- (ClassA *)calle2
    {
        ClassA *object1 = [[ClassA alloc] init];
        return [object1 autorelease];
    }


 - (void)CallerMethod
    {
        ClassA *object2 = [self calle];

        object2 = [self calle2];

    }

这里有没有内存泄漏,或者ClassA * object2 = [self calle]弱/赋值,第二次初始化后没有问题object2 = [self calle2],我们可以这样分配100个对象,没有memry泄漏会发生。

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

  

问题1 - 这种增加是否会保留计数?我认为这不是

不一定,但可能暂时增加它。在返回之前,objectAtIndex:可以retain然后autorelease实现该对象,根据...这将是非常友好的事情。

  

Q.2 - 那么现在object1指向解除分配的实例?如果我发送   消息它会崩溃??

如果-objectAtIndex:没有注意如上所述返回自动释放的对象,则可能。如果有任何疑问,在将容器从容器中取出之前,应自行保留该物体。因此,例如,-[UIView removeFromSuperView]的文档说:

  

如果您打算重复使用视图,请务必在调用之前保留它   方法并在适当的时候再次释放它。

这正是因为superview将发布视图。如果您没有保留它,那么可能会在那时取消分配。

  

所以我应该使用ClassA object1 = [[ClassAObjectContainer   objectAtIndex:0] retain];如果我想保持对象的存活和使用   它以后。

如果你想“稍后”使用它,你当然应该保留它。如果您打算“现在”使用它,那么您可能不需要保留该对象,这取决于(再​​次)ClassAObjectContainer所说的内容。

我不确定我是否会回答你的其他问题。但是,通常情况下,当您从其他方法获取对象时,您应该能够使用该对象而不保留它,除非您计划将其保留在接收它的方法的末尾之外。因此,如果您将其分配给实例变量或其他内容,则应通过调用retain来获取对象的所有权。集合的行为会使事情变得复杂 - 如果从集合中获取对象然后告诉该集合删除该对象,那么如果在删除对象之后需要它,则应该首先保留该对象。另一方面,如果你使用ARC(为什么不使用ARC?),你不必担心这些事情。

答案 1 :(得分:1)

以下是答案

Q1:没有。 retainCount的retainCount没有变化。

Q2:它取决于Index对象的ratainCount,即当它从数组中删除时,其retainCount将减1。如果删除后retainCount变为0,则会导致崩溃,否则不会。

AutoRelease:使用方法返回的自动释放对象(除了new / copy)时的黄金法则是保留它。工作完成后,您应该将其发布。 您可以根据需要进行尽可能多的初始化,但它可能会在创建所有对象时重载自动释放池。