iOS 9.3上不显示UIButton
我有一个UIButton,它不仅出现在iOS 9.3中 我不明白为什么。谁能告诉我我做错了什么 我需要ViewDidDisplay方法中的按钮,因为在设置此按钮后,需要放置一些其他布局元素 iPhone 6 8.1按钮设置位置:{100100},{42,42} iPhone6 9.3按钮设置位置:{{0,0},{0,0} iPhone 6Plus 8.1按钮设置位置:{100100},{42,42} iPhone 6Plus 9.3按钮设置位置:{{0,0},{0,0}iOS 9.3上不显示UIButton,ios,objective-c,iphone,uibutton,Ios,Objective C,Iphone,Uibutton,我有一个UIButton,它不仅出现在iOS 9.3中 我不明白为什么。谁能告诉我我做错了什么 我需要ViewDidDisplay方法中的按钮,因为在设置此按钮后,需要放置一些其他布局元素 iPhone 6 8.1按钮设置位置:{100100},{42,42} iPhone6 9.3按钮设置位置:{{0,0},{0,0} iPhone 6Plus 8.1按钮设置位置:{100100},{42,42} iPhone 6Plus 9.3按钮设置位置:{{0,0},{0,0} iOS 8和iOS 9的
iOS 8和iOS 9的内存管理似乎有所不同。你的财产很脆弱。在调用
[self.view addSubview:self.btnSettings]将按钮添加为子视图之前,它不会获得强引用代码>
似乎在ios9下,弱引用在到达调用之前被解除分配(属性设置为nil
)。但在iOS 8下,脆弱的属性会停留足够长的时间,以达到阻止其被释放的界限
简单的解决方案是使属性强
,而不是弱
另一个选项(感谢Jef)是保持属性弱
,但在viewdidappease
方法中使用局部变量。然后在将局部变量添加为子视图后,将局部变量指定给属性
另一个与代码无关的问题。如果此视图控制器显示其他视图控制器,则会多次调用viewdide:
方法,并最终添加多个按钮。将此代码移动到viewdiload
(它真正属于的位置),或者确保在视图控制器的生命周期内只调用一次viewdilead
中的代码。将属性从weak
更改为strong
。有什么不同吗?那太尴尬了。我不知道我怎么没抓住它。这就解决了问题。但为什么它在8中有效,而不是在9中有效呢?我总是对IBOutlets弱,而对所有由代码创建的UIElement强。我尊重地不同意。关于它丢失的原因,您完全正确,但我认为更好的解决方案是使用一个更临时的强指针-UIButton*aButton=//按钮配置;[self.view addSubview:aButton]//按钮现在保留为视图层次结构的一部分。。自我设置按钮=aButton@Jef这不是一个异议,这是一个非常好的替代方案,可以使属性强大
。我这么说是因为它对总体设计、内存管理等影响较小。最佳:)
#define MARGIN_SIZE 10
@interface HomeViewController ()
@property (weak, nonatomic) UIButton *btnSettings;
@end
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.btnSettings = [UIButton buttonWithType:UIButtonTypeCustom];
self.btnSettings.userInteractionEnabled = YES;
self.btnSettings.frame = CGRectMake(100, 100, 42, 42);
self.btnSettings.tag = 21;
[self.btnSettings setImage:[UIImage imageNamed:@"settings_black"] forState:UIControlStateNormal];
[self.btnSettings addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.btnSettings];
NSLog(@"Button Settings Location: %@", NSStringFromCGRect(self.btnSettings.frame) );
}