0

iOS新手在这里。

我有一个类,它是 UIViewController 的子类,称为 CommonVC。它没有直接关联的场景。它在 .h 文件中声明一个属性:

@property (strong, nonatomic) SomeClass *someClass;

我修改了我的一个场景视图控制器以将 CommonVC 作为超类而不是 UIViewContoller:

@interface SceneViewController : CommonVC

在 SceneViewController 中,我为属性创建了一个惰性实例化 getter:

- (SomeClass *)someClass 
{
  return self.someClass ? self.someClass :
  (self.someClass = [[SomeClass alloc] initWithData:@"xxx"]);
}

这可以编译,但在运行时会因 EXC_BAD_ACCESS(code=2,...) 而崩溃。调试器指向覆盖方法,'self' 为 nill (0x00000000)。

对 getter (self.someClass) 的第一个引用是在 viewDidLoad 方法中。我认为此时视图控制器及其超类将被实例化。

到底是怎么回事?

谢谢。

4

2 回答 2

1
return self.someClass ? self.someClass

这是一个无限循环。代码 self.someClass 等价于 [self someClass]; 所以这将被无休止地调用。您需要将 self.someClass 更改为 _someClass。

于 2013-06-14T14:01:42.967 回答
0

首先,如果你在你的 getter 中调用 self.someClass ,你最终会进入一个循环,因为 self.someClass 它实际上是在调用相同的方法。这可能是您崩溃的原因。

其次,每个 UIViewController 实例总是有一个与之关联的视图(您正在谈论的场景?),因此所有的 -viewDidLoad、-viewWillAppear 等方法。

最后,拥有一个“通用视图控制器”来处理事情是非常糟糕的。您可能想改用委托模式或单例模式。

于 2013-06-14T14:01:38.210 回答