在这种情况下,为什么我需要在重新分配之前将静态指针设置为nil

时间:2013-02-24 14:01:40

标签: objective-c static zombie-process

我有一个“总是在我的一个类的最后创建的对象”pattern 上保留一个静态引用。 当我创建它的新实例时,应该将静态指针设置为这个新实例。 解决了以下问题:

static AViewController *actualSelf = nil;

+ (AViewController *) getActualSelf {
    return actualSelf;
}

- (AViewController *) init {
    self = [super init];
    self.title = @"Title";

    actualSelf = nil; // Why do I need this line the second time init gets called?

    actualSelf = self; // this is the only line which sets actualSelf

    return self;
}

- (void)dealloc {
    actualSelf = nil;
}

…SOME IMPORTANT MUST BE MISSING, BUT I DON'T KNOW WHAT
  • 创建AViewController a> Init被称为>静态指针设置为
  • create AViewController b> Init被称为>静态指针应设置为b。但是静态指针没有设置为b!它将自己从 a 设置为nil!

对象a大部分时间是在创建b之前解除分配的。

在解除分配时,我是否总是需要将静态变量重置为nil?不,请看下面我自己的答案。

如果没有“actualSelf = nil;”这一行,通过ARC对象a会在actualSelf设置为对象b时被取消分配。

2 个答案:

答案 0 :(得分:2)

actualSelf = nil; // WHY DO I NEED THIS LINE?

你不需要该行,它什么都不做,可能会被发布版本中的编译器优化器消除。

班级不是单身人士。

其余答案已被删除,因为问题已被修改。

答案 1 :(得分:1)

  
      
  • 创建AViewController a> Init被称为>静态指针设置为
  •   
  • create AViewController b> Init被称为>静态指针应设置为b。但是静态指针没有设置为b!它设定了自己   从 a 到nil!
  •   

除了actualSelf之外,其他任何内容都可能拥有a。因此,在actualSelf = self;初始化期间b会导致a完全释放并因此被释放。在-dealloc的{​​{1}}期间,它将a设置为actualSelf。显然,这是在将nil分配给新actualSelf(对象self)之后。 (ARC提供的b呼叫与-release分配的准确操作顺序是不可预测的。)

您在actualSelf方法中将actualSelf分配给nil的事实闻起来很糟糕。它表明-dealloc应该是actualSelf,因为如果它对某个对象有强引用,那么该对象就无法解除分配。

至少,__weak应该在重置之前测试-dealloc是否等于actualSelf。但只要self是强引用,那就永远不会成立,因为强烈引用的对象无法解除分配。

这整个方法存在很大问题。你真的想要完成什么?