0

我有一些奇怪的行为。

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 上运行它时,它在尝试添加布局约束(代码的最后一行)时崩溃,抱怨说stackViewnil

单步执行代码后,我实际上发现它stackView位于nil第一行之后,即对[UIStackView alloc]. 这对我来说很奇怪,因为我不知道为什么 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]]

在这种情况下,stackViewnil在组合alloc/init调用之后,但我不知道是哪一个成功nil的。这就是为什么我把电话分开来看看。

4

1 回答 1

0

我认为问题在于您错误地创建了 UIStackView。它应该像下面这样创建:

UIStackView *stackView = [[UIStackView alloc] init];

似乎 ARC 只是立即清理 UIStackView ,因为您没有正确持有对它的引用。

实际设备和模拟器之间的差异很可能归因于 ARC 在模拟器上以不同的时间间隔工作。总是先在实际设备上测试代码的另一个原因!;)

于 2015-12-22T21:11:07.167 回答