设置为非NULL值后,对象将重置为NULL

时间:2013-09-03 22:12:39

标签: objective-c variables null

我有两个Objective-C类,它们通过方法参数传递变量来相互通信。例如,我可能会调用一个传递变量的方法:

ClassX *x = [[ClassX alloc] init];
[x passThisParameter:i];

ClassX方法内passThisParameter成功收到变量。我可以通过断点和日志输出来确认:

- (void)passThisParameter:(id)object {
    self.classVariable = object;
    NSLog(@"Object: %@", self.classVariable); // In the log I can see that classVariable has the same value as object does.
}

但是,当我尝试在上述范围之外使用classVariable时(例如,在另一个方法中,但在同一个类中),它总是显示为NULL为什么我的classVariable会重置为NULL?以下是我以后检索变量的方法:

- (void)anotherMethodFromClassX {
    NSLog(@"Class Variable: %@", self.classVariable); // This is always NULL even though the variable is never used anywhere else (except when it's set in the method above)
}

我还尝试在我的类定义/标头和实现中以各种方式设置变量:

  • @property (retain) id classVariable
  • @property (strong) id classVariable
  • @property (assign) id classVariable
  • @property (nonatomic, strong) id classVariable

有关为什么此classVariable重置为NULL的任何想法?我无法弄清楚,在谷歌上找不到多少。如果我的某些编程术语不正确,请原谅我。

编辑:我使用的是ARC,而不是MRC。

编辑:在我设置ClassX可以重置为classVariable之后,是否可以重新分配并重新初始化NULL?说它在UI中重新加载......

编辑:这是我的ClassXClassZ及相关代码available online

1 个答案:

答案 0 :(得分:1)

所有@property变体都是实例变量,因此您设置的值将设置在实例上,而不是类。所以,当你不做任何事情来保留x并且它被ARC摧毁时,它就会随之而来。下次创建ClassX的新实例时,它是干净清新的,因此值为nil。解决方案是保留x并重用它而不是允许它被销毁(并对类和实例变量进行一些研究)。