iOS 9.3上不显示UIButton

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的

我有一个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的内存管理似乎有所不同。你的财产很脆弱。在调用
[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) );

}