1

我有两个 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相关的在线代码。

4

1 回答 1

2

您的所有@property变体都是实例变量,因此您设置的值被设置到实例上,而不是类上。所以,当你什么都不做保留x它被 ARC 破坏时,价值也就随之而来。下次您创建它的新实例时,ClassX它是干净和新鲜的,因此值为nil. 解决方案是保留x和重用它,而不是让它被销毁(并对类和实例变量进行一些研究)。

于 2013-09-03T23:01:38.550 回答