UITextView alloc崩溃iOS4上的应用程序

时间:2010-09-10 12:32:07

标签: iphone crash uitextview

我对这件事感到非常难过。我正常工作的应用程序[在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协议。

有人可以帮忙吗?

提前完成。

2 个答案:

答案 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];

如果你没有将它声明为属性,那么它将不会保留变量并且会很快忘记它。

我会假设这是你的问题。如果它不起作用然后告诉我,我会再看看。