2013-02-18 104 views
1

我需要对以下代码进行一些说明。将对象分配给本地对象增加保留计数的目标C

我有一个包含ClassA对象的数组。然后我检索它的一个对象,并将其分配给本地变量object1。

ClassA object1 = [ClassAObjectContainer objectAtIndex:0]; 

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

现在我删除对象

[ClassAObjectContainer removeObjectAtIndex:0]; 

(问2 - 所以现在object1点释放实例??如果我发送消息它会崩溃??

所以我应该使用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]; 
} 

另一件事是什么在这种情况下happend更好的方法,

- (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个对象,并且不会发生任何内存泄漏。

谢谢你的时间。

+0

下面是答案Q1的答案:NO。对于简单分配,retainCount不会有任何更改。 – nkongara 2013-02-18 06:23:52

回答

1

Q.1 - 这增加保留计数吗?我认为这不是

不一定,但它可能会暂时增加它。的objectAtIndex:可能retain然后autorelease对象执行返回之前,这将是在光做一个非常友好的事......

Q.2 - 所以现在object1点释放的实例?如果我发送 消息它会崩溃?

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

如果你打算重用一个视图,可以肯定的调用此方法 之前把它保留下来,并再次释放后适当。

这正是因为superview会释放视图。如果您没有保留它,那么可能会在此时释放它。

所以我应该使用ClassA object1 = [[ClassAObjectContainer objectAtIndex:0] retain];如果我想让对象保持活动状态并稍后使用 。

当然,如果您想稍后使用它,您应该保留它。如果你要“现在”使用它,那么你可能不需要保留这个对象,这取决于什么ClassAObjectContainer说。

我不确定我是否按照您的问题的其余部分。但是,通常情况下,当您从其他方法获取对象时,除非您计划将其保留在接收方法的最后,否则应该可以使用该对象而不保留它。因此,如果您将它分配给一个实例变量或某物,您应该通过调用retain来获取该对象的所有权。集合的行为会使事情稍微复杂一些 - 如果从集合中获取对象,然后通知集合删除对象,那么如果在删除对象后需要它,则实际上应该预期必须先保留该对象。另一方面,如果你使用ARC(你为什么不这样做?),你不必担心这样的事情。

+0

“Q.1 - 这种增加是否保留了数量?我认为这不是” - 我认为这个问题应该是 - '它是否将所有权转让给object1'。所以在这种情况下答案是否定的? – russell 2013-02-18 06:44:02

+0

@russell这是关于正确的 - 简单地将对象指针分配给局部变量不会导致对象被保留。但是,获取对象*可能会导致对象被保留和自动释放,在这种情况下,对象在您接收方法的持续时间内可以安全使用。此外,如果您使用保留语义将对象指针指定给*属性*,则该赋值将触发属性设置器,并且*将*保留该对象。你只是想了解规则,还是你陷入了某种困境? – Caleb 2013-02-18 06:54:13

1

下面是答案

Q1:对于简单分配,retainCount不会有任何更改。

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

AutoRelease:使用方法返回的自动释放对象(除new/copy之外)的黄金法则是保留它。一旦工作完成,你应该释放它。 您可以根据需要执行尽可能多的初始化操作,但可能会使所有创建的对象的自动释放池过载。

+0

感谢您的回答。这真的很有帮助,我正在赞扬它。 – russell 2013-02-18 07:03:44

相关问题