UIStackView分配调用仅在实际的ipad上返回nil,而不是在模拟器上



我有一些奇怪的行为。

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在模拟器上以不同的间隔工作。这只是始终首先在实际设备上测试代码的另一个原因!)

相关内容

  • 没有找到相关文章

最新更新