-2

对于我的一个类,我有一个“始终在最后创建的对象上保留静态引用”模式。当我创建它的新实例时,应该将静态指针设置为这个新实例。解决方法如下:

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 被调用 > 静态指针设置为
  • 创建 AViewController b > 调用初始化 > 静态指针应设置为 b。但是静态指针没有设置为b!它把自己从a设置为 nil!

对象 a 大部分时间在 b 被创建之前被释放。

释放静态变量时是否总是需要将它们重置为零?不,请参阅下面我自己的答案。

如果没有“actualSelf = nil;”行,则通过 ARC 对象 a 在actualSelf 设置为对象 b 的那一刻被释放。

4

2 回答 2

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

您不需要这条线,它什么也没做,并且可能会在发布版本中被编译器优化器消除。

该类不是单例。

由于问题已被修改,其余答案已被删除。

于 2013-02-24T14:04:39.290 回答
1
  • 创建 AViewController a > Init 被调用 > 静态指针设置为
  • 创建 AViewController b > 调用初始化 > 静态指针应设置为 b。但是静态指针没有设置为b!它把自己从a设置为 nil!

可能除了actualSelf拥有a. 因此,actualSelf = self;在初始化过程中b会导致a被完全释放并因此被释放。在 的期间-dealloca它设置actualSelfnil。显然,这是在分配actualSelf给新的self(对象b)之后发生的。-release(ARC 提供的调用相对于分配的精确操作顺序actualSelf是不可预测的。)

您在方法中分配actualSelf的事实很糟糕。它表明应该是因为如果它持有对一个对象的强引用,那么该对象就不能被释放。nil-deallocactualSelf__weak

至少,应该在重置之前-dealloc测试是否actualSelf等于。self但只要actualSelf是强引用,这永远不会是真的,因为强引用的对象不能被释放。

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

于 2013-02-24T19:29:56.063 回答