将对象分配给本地对象增加保留计数的目标C
我需要对以下代码进行一些说明。将对象分配给本地对象增加保留计数的目标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个对象,并且不会发生任何内存泄漏。
谢谢你的时间。
Q.1 - 这增加保留计数吗?我认为这不是
不一定,但它可能会暂时增加它。的objectAtIndex:
可能retain
然后autorelease
对象执行返回之前,这将是在光做一个非常友好的事......
Q.2 - 所以现在object1点释放的实例?如果我发送 消息它会崩溃?
如果-objectAtIndex:
没有注意如上所述返回自动释放对象,如果有任何疑问,在将其从容器中取出之前,您应该保留该物品。因此,例如,对于-[UIView removeFromSuperView]
该文件说:
如果你打算重用一个视图,可以肯定的调用此方法 之前把它保留下来,并再次释放后适当。
这正是因为superview会释放视图。如果您没有保留它,那么可能会在此时释放它。
所以我应该使用ClassA object1 = [[ClassAObjectContainer objectAtIndex:0] retain];如果我想让对象保持活动状态并稍后使用 。
当然,如果您想稍后使用它,您应该保留它。如果你要“现在”使用它,那么你可能不需要保留这个对象,这取决于什么ClassAObjectContainer
说。
我不确定我是否按照您的问题的其余部分。但是,通常情况下,当您从其他方法获取对象时,除非您计划将其保留在接收方法的最后,否则应该可以使用该对象而不保留它。因此,如果您将它分配给一个实例变量或某物,您应该通过调用retain
来获取该对象的所有权。集合的行为会使事情稍微复杂一些 - 如果从集合中获取对象,然后通知集合删除对象,那么如果在删除对象后需要它,则实际上应该预期必须先保留该对象。另一方面,如果你使用ARC(你为什么不这样做?),你不必担心这样的事情。
“Q.1 - 这种增加是否保留了数量?我认为这不是” - 我认为这个问题应该是 - '它是否将所有权转让给object1'。所以在这种情况下答案是否定的? – russell 2013-02-18 06:44:02
@russell这是关于正确的 - 简单地将对象指针分配给局部变量不会导致对象被保留。但是,获取对象*可能会导致对象被保留和自动释放,在这种情况下,对象在您接收方法的持续时间内可以安全使用。此外,如果您使用保留语义将对象指针指定给*属性*,则该赋值将触发属性设置器,并且*将*保留该对象。你只是想了解规则,还是你陷入了某种困境? – Caleb 2013-02-18 06:54:13
下面是答案
Q1:对于简单分配,retainCount不会有任何更改。
Q2:它依赖于索引对象的ratainCount,即当它从数组中删除时,其retainCount将减1。如果retainCount在删除后变为0,则会导致崩溃,否则将导致崩溃。
AutoRelease:使用方法返回的自动释放对象(除new/copy之外)的黄金法则是保留它。一旦工作完成,你应该释放它。 您可以根据需要执行尽可能多的初始化操作,但可能会使所有创建的对象的自动释放池过载。
感谢您的回答。这真的很有帮助,我正在赞扬它。 – russell 2013-02-18 07:03:44
下面是答案Q1的答案:NO。对于简单分配,retainCount不会有任何更改。 – nkongara 2013-02-18 06:23:52