断言失败的原因是啥

Posted

技术标签:

【中文标题】断言失败的原因是啥【英文标题】:What are reasons of assertion failure断言失败的原因是什么 【发布时间】:2013-09-23 07:43:21 【问题描述】:

我有 2 个在 .h 文件中创建的按钮和一个自定义视图

UIButton *btn_YourAccoun;
UIButton *btn_CreateAccoun;
UIView *view_top;

在 .m 文件中

- (void)viewDidLoad

    [super viewDidLoad];

    view_top=[[UIView alloc]initWithFrame:CGRectMake(0, 0,320,60)];
    [view_top setBackgroundColor:[UIColor colorWithRed:80.0/255.0 green:79.0/255.0 blue:81.0/255.0 alpha:1.0]];
    [self.view addSubview:view_top];

    UILabel *labelheader=[[UILabel alloc]initWithFrame:CGRectMake(140, 5, 140, 20)];
    [labelheader setText:@"CREATE AN ACCOUNT"];
    [labelheader setTextColor:[UIColor whiteColor]];
    [labelheader setTextAlignment:UITextAlignmentLeft];
    [view_top addSubview: labelheader];


    btn_YourAccoun=[[UIButton buttonWithType:UIButtonTypeCustom]init ];
    [btn_YourAccoun setFrame:CGRectMake(0,0,65,44)];

    [btn_YourAccoun setTitle:@"YOUR ACCOUNT" forState:UIControlStateNormal];
    [btn_YourAccoun setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [btn_YourAccoun.titleLabel setFont:[UIFont systemFontOfSize:12.0]];
    [btn_YourAccoun setBackgroundColor:[UIColor clearColor]];
    CALayer *layer1=[btn_YourAccoun layer];
    layer1.backgroundColor=[UIColor colorWithRed:232.0/255 green:230.0/255.0 blue:236.0/255.0 alpha:1.0].CGColor;
    layer1.borderWidth=2.0;
    layer1.borderColor=[UIColor colorWithRed:184.0/255 green:185.0/255.0 blue:188.0/255.0 alpha:1.0].CGColor;


    [view_top addSubview:btn_YourAccoun];

    btn_CreateAccoun=[[UIButton buttonWithType:UIButtonTypeCustom]initWithFrame:CGRectMake(270, 0, 55,44)];
    [btn_CreateAccoun setTitle:@"Create" forState:UIControlStateNormal];
    [btn_CreateAccoun setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [btn_CreateAccoun.titleLabel setFont:[UIFont systemFontOfSize:12.0]];
    [btn_CreateAccoun setBackgroundColor:[UIColor clearColor]];
    CALayer *layer2=[btn_CreateAccoun layer];
    layer2.backgroundColor=[UIColor colorWithRed:232.0/255 green:230.0/255.0 blue:236.0/255.0 alpha:1.0].CGColor;
    layer2.borderWidth=2.0;
    layer2.borderColor=[UIColor colorWithRed:184.0/255 green:185.0/255.0 blue:188.0/255.0 alpha:1.0].CGColor;
    [view_top addSubview:btn_CreateAccoun];





当我为 btn_YourAccoun 设置框架时出现错误

error-:-[UIButton initWithFrame:] 中的断言失败, /SourceCache/UIKit_Sim/UIKit-1912.3/UIButton.m:921

请帮帮我

【问题讨论】:

【参考方案1】:

你有这个:

btn_CreateAccoun = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(270, 0, 55,44)];

您不应该使用工厂方法初始化程序。你要么想要:

btn_CreateAccoun = [[UIButton alloc] initWithFrame:CGRectMake(270, 0, 55,44)];

或:

btn_CreateAccoun = [UIButton buttonWithType:UIButtonTypeCustom];
btn_CreateAccoun.frame = CGRectMake(270, 0, 55,44);

更新

您已在 cmets 中询问过此类错误的原因是什么。我假设您的意思是断言失败。 assertion 是程序员用来确保不应该发生的事情没有发生的东西。这可能是任何事情 - 如果您遇到断言失败,您需要更多地了解它发生在何时何地,才能知道出了什么问题。

在 Objective-C 中,每个对象都应该被分配一次并初始化一次。因为一个对象只应该被初始化一次,程序员已经断言它不应该被初始化更多。像buttonWithType: 这样的工厂方法分配 初始化对象,因此当您调用buttonWithType:initWithFrame: 时,您已经对其进行了两次初始化,因此断言失败。

希望这是有道理的。

【讨论】:

嘿西蒙,非常感谢你现在它正在工作但是告诉我这种错误的原因是什么 没问题。如果您对答案感到满意,请单击它旁边的绿色勾号。并欢迎堆栈溢出!

以上是关于断言失败的原因是啥的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中“后向断言必须是固定长度”的技术原因是啥?

失败的java断言失败的原因

-[firtrace inittracewithname:] 中的崩溃断言失败,firtrace.m:86。 NSInternalInconsistencyException',原因:'名称不能为 n

域名转移失败一般是啥原因?

总是网络请求失败是啥原因?

hadoop中这种失败的原因是啥?