我对这件事感到非常难过。我正常工作的应用程序[在iOS< = 3.1]上崩溃了iOS4。当我尝试调试它时,我看到它在这一行崩溃了:
编辑:我尝试更改此语句的位置并将一些日志语句检查,我可以确认应用程序正在崩溃。
这是我的代码的一部分:
//Various allocations here like
lblForAttachingPhoto = [[UILabel alloc]initWithFrame:CGRectMake(235, 105, 40, 20)];
lblForAttachingPhoto.backgroundColor = [UIColor grayColor];
[lblForAttachingPhoto setText:@"140"];
[lblForAttachingPhoto setTextAlignment:UITextAlignmentCenter];
btnAttachPhoto = [UIButton buttonWithType:UIButtonTypeCustom];
btnAttachPhoto.frame = CGRectMake(275, 105, 20, 20);
btnAttachPhoto.autoresizesSubviews = YES;
btnAttachPhoto.clipsToBounds = YES;
[btnAttachPhoto setImage:[UIImage imageNamed:@"arrow.jpg"] forState:UIControlStateNormal];
[btnAttachPhoto addTarget:self action:@selector(attachPhoto) forControlEvents:UIControlEventTouchUpInside];
viewForAttaching = [[UIView alloc]init];
viewForAttaching.frame = CGRectMake(5, -340, 310, 140);
for(NSInteger e=0;e<[_appDelegate.genericArray count];e++)
{
[genericArray addObject:[_appDelegate.genericArray objectAtIndex:e]];
}
for(NSInteger f=0; f< [_appDelegate.category_type count]; f++)
{
[category_type addObject:[_appDelegate.category_type objectAtIndex:f]];
}
txtVw = [[UITextView alloc]init]; //txtVw is a textview
但是,尽管textview分配声明的陈述位置,它正在使应用程序崩溃。
控制台输出:
Program received signal: “EXC_BAD_ACCESS”.
warning: check_safe_call: could not restore current frame
warning: Unable to restore previously selected frame.
有可能吗?我也在实现UITextViewDelegate协议。
有人可以帮忙吗?
提前完成。
答案 0 :(得分:2)
崩溃实际上不太可能是由于UITextView初始化造成的。我实际上怀疑在for()循环中它上面的行。你的命名和内存管理非常不一致,这在ObjC中很危险。
首先,为变量赋予一致的名称。 category_type
听起来像枚举,但似乎是NSMutableArray
。这种命名会在ObjC中杀死你;你必须跟踪什么是因为编译器通常不会捕获类型不匹配。您的名称应为categoryTypes
。
接下来,您不应直接访问您的ivars。始终使用访问者。总是。 (除了可能在dealloc
;在那里存在争议。)这是避免EXC_BAD_ACCESS的第一种方法。你显然没有正确地保留一些东西。访问者可以防止这种情况发生。
您真的想将_appDelegate.genericArray
追加到genericArray
吗?或者你真的想让genericArray
复制_appDelegate.genericArray
吗?或者您只是希望genericArray
指向_appDelegate.genericArray
?如果你想要一份副本,只需复制它:
self.genericArray = [NSMutableArray arrayWithArray:self.appDelegate.genericArray];
我知道所有这些听起来都像“只是风格”,但一贯的风格对于稳定的ObjC绝对至关重要。你会看到你遇到的各种令人讨厌的崩溃事件。
您还应该点击“Cmd-Shift-A”并让静态分析器为您寻找错误。
答案 1 :(得分:0)
您需要保留txtVw变量。问题是,当你的代码将对象分配给txtVw时,应用程序已经“忘记”了它。试试这个来解决它。在你的init方法中执行:
txtVw = [[UITextView alloc]init];
[txtVw retain];
如果你没有将它声明为属性,那么它将不会保留变量并且会很快忘记它。
我会假设这是你的问题。如果它不起作用然后告诉我,我会再看看。