目标c - 内存管理

时间:2010-06-12 10:34:47

标签: objective-c

让我说我有一个等级

@interface Foo :NSobject  
{  
  NSstring *a;  
  NSDate *b;  
}  
Foo *temp;  

我的问题是:当我使用[temp retain]时 会员的柜台也保留吗? 让我说我从某种方法得到了类的参考,我想保留这个类,我需要保留每个成员吗?

3 个答案:

答案 0 :(得分:2)

  

当我使用[temp retain]时,成员的计数器也会保留吗?

没有

  

让我说我从某种方法得到了类的参考,我想保留这个类,我需要保留每个成员吗?

没有。

成员的生命周期应该由Foo类本身管理,而不是Foo类的用户。如果您可以/需要更改成员的保留计数,则该类未正确封装。

答案 1 :(得分:0)

不,呼叫[temp retain]不会保留ab。您将看到的典型模式是ab保留在类的-init方法中,并在-dealloc方法中释放,这样可以将它们保留为只要对象是。例如:

@implementation Foo

- ( id)initWithA:( NSString * )aString andB:( NSString * )bString
{
    if ( self = [ super init ]) {
        a = [ aString copyWithZone:[ self zone ]];
        b = [ bString copyWithZone:[ self zone ]];
    }

    return self;
}

- ( void )dealloc
{
    [ a release ];
    [ b release ];

    [ super dealloc ];
}

@end

在此示例中,ab会因-copyWithZone:调用而自动保留。你不需要自己保留它们。

答案 2 :(得分:0)

Eimantas,

如果您使用垃圾收集,则可以假设。由于你没有指定一个iPhone应用程序,我猜你会在谈论一个OS X应用程序,然后问题仍然是你为Leopard或以上构建?