分配ivar不工作

时间:2011-05-19 04:50:20

标签: objective-c cocoa-touch ios

我看到一个奇怪的情况,即对实例变量的简单赋值不起作用。右手对象是非零的,但拒绝分配给实例变量(具有相同的类型)。这不会在应用程序中持续发生。

我有一个这样的课程:

@interface FooViewController : UIViewController {
  UIView *contentView;
  BOOL testBool;
}
@end
@implementation FooViewController
- (void)viewDidLoad {
  UIView *theContentView = [[UIView alloc] initWithFrame:self.view.bounds];

  // this assignment fails for some reason:
  contentView = [theContentView retain];
  /* at this point, contentView == nil */

  UIView *bar = theContentView; // this works
  testBool = YES; // this works
}
@end

和这样的子类:

@interface BarViewController : FooViewController {
}
@end

当我从nib实例化BarViewController时,当执行到达超类中定义的viewDidLoad时,会发生上面的奇怪行为。实例变量“拒绝分配”。

但是,如果我向子类添加一个虚拟实例变量,则会返回预期的行为。实例变量在viewDidLoad中正确分配。

我在运行时在iOS 4.3中使用Xcode 4.0.2在模拟器中看到了这一点。 LLVM + GCC和GCC都会发生这种情况。

这不是孤立发生的。当我在测试项目中尝试这个时,它会正常运行。

1 个答案:

答案 0 :(得分:0)

对不起,但我不相信你。

我的第一个问题是你如何确定contentView等于零?在 作业之后,你有一个断点 吗?如果你在分配的行上中断,那行还没有被执行,那么contentView将在那时为零。

如果您在某个其他方法中测试contentView,可能只是viewDidLoad尚未运行。

告诉我输出:

- (void)viewDidLoad {
  UIView *theContentView = [[UIView alloc] initWithFrame:self.view.bounds];

  // this assignment fails for some reason:
  contentView = [theContentView retain];
  /* at this point, contentView == nil */

  NSLog(@"theContentView: %p", theContentView);
  NSLog(@"contentView:    %p", contentView);

  UIView *bar = theContentView; // this works
  testBool = YES; // this works
}

如果他们不同,我会开始相信你。 (好吧,也许不是,我仍然会考虑你说谎的可能性。)