我看到一个奇怪的情况,即对实例变量的简单赋值不起作用。右手对象是非零的,但拒绝分配给实例变量(具有相同的类型)。这不会在应用程序中持续发生。
我有一个这样的课程:
@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都会发生这种情况。
这不是孤立发生的。当我在测试项目中尝试这个时,它会正常运行。
答案 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
}
如果他们不同,我会开始相信你。 (好吧,也许不是,我仍然会考虑你说谎的可能性。)