我无法弄清楚这个崩溃:[__NSArrayM insertObject:atIndex:]: object cannot be nil
Posted
技术标签:
【中文标题】我无法弄清楚这个崩溃:[__NSArrayM insertObject:atIndex:]: object cannot be nil【英文标题】:I can't figure this crash out: [__NSArrayM insertObject:atIndex:]: object cannot be nil 【发布时间】:2014-01-16 01:51:00 【问题描述】:当我在我的设备上测试应用程序时,我遇到了 [__NSArrayM insertObject:atIndex:]: object cannot be nil 崩溃,但在 ios 模拟器上却没有。
这是怎么回事:
我在视图控制器上管理 5 个UITextField
,然后我使用 IBAction(当我按下按钮时)通过 NSString
将每个 UITextField 的文本传递给 另一个视图控制器 ,它会崩溃)。
TextViewController
- (IBAction)choicebutton:(id)sender
AnswerViewController *AVC = [self.storyboard instantiateViewControllerWithIdentifier:@"AnswerViewController"];
AVC.stringFromChoice1 = self.choice1.text;
AVC.stringFromChoice2 = self.choice2.text;
AVC.stringFromChoice3 = self.choice3.text;
AVC.stringFromChoice4 = self.choice4.text;
AVC.stringFromChoice5 = self.choice5.text;
[self presentViewController:AVC animated:YES completion:nil];
然后在 AnswerViewController 上,我正在创建一个 NSMutableArray
并将 NSStrings 随机化以显示在 UILabel
上。
AnswerViewController
- (void)viewDidLoad
self.choiceAnswers1 = [[NSMutableArray alloc] initWithCapacity:5];
if(![self.stringFromChoice1 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice1];
if(![self.stringFromChoice2 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice2];
if(![self.stringFromChoice3 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice3];
if(![self.stringFromChoice4 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice4];
if(![self.stringFromChoice5 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice5];
int index = arc4random() % [self.choiceAnswers1 count];
self.choiceanswer.text = self.choiceAnswers1[index];
self.choiceanswer1.text = self.choiceAnswers1[index];
我已经这样设置了,以防用户没有填写所有的 UITextFields,这对崩溃有什么影响吗?这个我搞不明白,求大神帮忙!
谢谢!
【问题讨论】:
那么它在哪里崩溃了? 当我触发 IBAction 时它崩溃了 【参考方案1】:不要对空字符串使用compare:
——它不会捕捉到你的字符串是nil
而不是@“”
的情况。这是两种截然不同的情况。
而不是这个:
if(![self.stringFromChoice1 isEqualToString:@""])
[self.choiceAnswers1 addObject:self.stringFromChoice1];
使用这个:
if (self.stringFromChoice1.length)
[self.choiceAnswers1 addObject:self.stringFromChoice1];
由于在 C 中任何非 0 值都是 true,并且由于向 nil 对象发送消息总是返回 0,所以这可以捕获所有情况。并且不那么啰嗦。
代码越少越好!
【讨论】:
只有我会把
留在里面。由于缺少
,对if
语句进行“快速、简单的编辑”的案例太多了。
我禁止在我的应用程序中使用它们。我理解你的论点,但我的反驳始终是 Xcode 真的很擅长缩进,你应该把它打开,如果你用糟糕的缩进提交,我无论如何都会刺伤你。我的新员工正在接受培训。额外的线条和符号,BLEH。
当我在设备上测试它时,它仍然给我同样的崩溃,但它在模拟器上运行良好。
你确定你已经重建了模拟器版本吗?它们是不同的二进制文件。它在同一个地方崩溃吗?您能否发布堆栈跟踪(在调试器中键入“bt”并复制/粘贴前 15 行左右)。
必须是if (self.stringFromChoice1.length)
。 !
与您想要的相反。【参考方案2】:
改变你 viewDidLoad 这样的东西。
- (void)viewDidLoad
self.choiceAnswers1 = [[NSMutableArray alloc] init];
if(self.stringFromChoice1.length > 0)
[self.choiceAnswers1 addObject:self.stringFromChoice1];
if(self.stringFromChoice2.length > 0)
[self.choiceAnswers1 addObject:self.stringFromChoice2];
if(self.stringFromChoice3.length > 0)
[self.choiceAnswers1 addObject:self.stringFromChoice3];
if(self.stringFromChoice4.length > 0)
[self.choiceAnswers1 addObject:self.stringFromChoice4];
if( self.stringFromChoice5.length > 0)
[self.choiceAnswers1 addObject:self.stringFromChoice5];
int index = arc4random() % [self.choiceAnswers1 count];
self.choiceanswer.text = self.choiceAnswers1[index];
self.choiceanswer1.text = self.choiceAnswers1[index];
让我知道这有帮助.. :)
【讨论】:
以上是关于我无法弄清楚这个崩溃:[__NSArrayM insertObject:atIndex:]: object cannot be nil的主要内容,如果未能解决你的问题,请参考以下文章
领域:获取 -[__NSArrayM UTF8String]:无法识别的选择器发送到实例
表视图崩溃与'*** - [__NSArrayM insertObject:atIndex:]:对象不能为零'
Firebase Swift 无法将“__NSArrayM”(0x10591cc30)类型的值转换为“NSDictionary”
无法将“__NSArrayM”类型的值转换为“NSDictionary”
我们可以通过使用@try,catch 机制来防止崩溃吗?如果错误是 -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty arra