我有一些奇怪的行为。
UIStackView *stackView = [UIStackView alloc];
stackView = [stackView initWithArrangedSubviews:@[self.subview1,self.subview2]];
[self addSubview:stackView];
[stackView setTranslatesAutoresizingMaskIntoConstraints:NO]
[self addConstraint:[NSLayoutConstraint constraintWithItem:stackView attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0]]
当我使用XCode中的Ipad Air 2模拟器时,此代码运行良好,但当我实际尝试在Ipad Air 2中运行它时,它在尝试添加布局约束(代码的最后一行)时崩溃,抱怨stackView
就是nil
。
在遍历代码时,我实际上发现stackView
在第一行(对[UIStackView alloc]
的调用)之后就是nil
。这对我来说很奇怪,因为我不知道为什么alloc调用会return nil
,更不知道为什么它只在实际设备上return nil
,而不是在设备的模拟上。
编辑:
我最初的代码如下:
UIStackView * stackView = [[UIStackView alloc] initWithArrangedSubviews:@[self.subview1,self.subview2]];
[self addSubview:stackView];
[stackView setTranslatesAutoresizingMaskIntoConstraints:NO]
[self addConstraint:[NSLayoutConstraint constraintWithItem:stackView attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0]]
在这种情况下,stackView
在组合的alloc
/init
调用之后是nil
,但我不知道是哪个调用使其成为nil
。所以我把电话分出来看。
我认为问题在于您创建的UIStackView不正确。它应该像下面这样创建:
UIStackView *stackView = [[UIStackView alloc] init];
ARC似乎只是在立即清理UIStackView,因为您没有正确地保存对它的引用。
实际设备和模拟器之间的差异可能归因于ARC在模拟器上以不同的间隔工作。这只是始终首先在实际设备上测试代码的另一个原因!)