我有一个“总是在我的一个类的最后创建的对象”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
对象a大部分时间是在创建b之前解除分配的。
在解除分配时,我是否总是需要将静态变量重置为nil?不,请看下面我自己的答案。
如果没有“actualSelf = nil;”这一行,通过ARC对象a会在actualSelf设置为对象b时被取消分配。
答案 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
是强引用,那就永远不会成立,因为强烈引用的对象无法解除分配。
这整个方法存在很大问题。你真的想要完成什么?