在viewdidload中分配内容的最安全方法

时间:2011-01-18 01:59:52

标签: iphone objective-c

声明。

 @property (nonatomic, retain) footballResultsParser * FBRP;

分配方法。

-(void) viewDidLoad
 {
    if (FBRP == nil)
    {
     FBRP = [[footballResultsParser alloc] init];
     [FBRP updateResults];
    }
  }

这是在viewDidLoad中分配对象的正确和安全的方法吗? 我假设可能会多次调用viewDidLoad并且该对象可能已经存在。

安全地解除安全。

-(void) dealloc
{
    if (FBRP != nil)
    {
     [FBRP release];
    }
}

有没有更好的方法来进行内存管理呢?

3 个答案:

答案 0 :(得分:3)

您还应该在viewDidUnload中释放它们。作为参考,以下是UIViewController class reference中的相关文档。

  

当发生低内存警告时,   UIViewController类清除它   视图是否知道它可以重新加载或   之后再次重新创建它们。如果这   发生了,它也叫   viewDidUnload方法给你的代码   有机会放弃对。的所有权   任何与之关联的对象   视图层次结构,包括对象   加载了nib文件, 对象   在viewDidLoad方法中创建 ,   和运行时懒惰创建的对象   并添加到视图层次结构中。   通常,如果您的视图控制器   包含出口(属性或原始   包含IBOutlet的变量   关键字),你应该使用   viewDidUnload方法放弃   这些商店的所有权或任何   其他与视图无关的数据   需要更久。

顺便说一句,在发布时,你不必检查对象是否为零。发送消息给nil什么都不做,这是安全的。

答案 1 :(得分:2)

由于你将FBRP属性设置为retain,并且正在利用我假设的合成,那么只需使用:

self.FBRP = [[[footballResultsParser alloc] init] autorelease];

在viewdidload中(通常)并在dealloc中释放。由于保留在财产上,保留计数应该在自动释放后仅增加1(是的,使用self。表示法)

答案 2 :(得分:0)

您应该在init方法中分配实例,而不是viewDidLoad方法。 你应该初始化变量_FBRP(或你如何称呼它),但不是属性。

-(id)init
{
    if (self = [super init])
    {     
        _FBRP = [[footballResultsParser alloc] init];
    }
    return self;
}

和dealloc

-(void) dealloc
{
     [FBRP release];
     [super dealloc];
}