modalViewController错误。我见过的最奇怪的事

时间:2009-09-20 05:03:48

标签: iphone objective-c cocoa-touch uitableview

我对我在程序中遇到的一个奇怪的错误感到很开心。

我有tableViewController navigationBar。当用户点击ADD上的navigationBar按钮时,系统会显示模式tableViewController。此viewController CANCEL上有一个navigationBar按钮(通过授权取消viewController

tableViewController的自定义单元格包含UIButtonUITextFieldUITextView

错误是由遵循这一系列操作(而不是其他操作)引起的:

  • 我在UITextView(位于其中一个单元格中)中输入了一些文字
  • 在不关闭键盘的情况下,我向上滚动tableView
  • 我点击取消按钮(以便取消模态视图控制器)
  • 返回主tableViewController,再次点击ADD按钮,

我收到exec_bad_access错误。

没有其他任何原因导致此错误。

如果我尝试使用UITextField完全相同的程序,那么事情就好了。

此外,如果我从上面的序列中排除任何列出的步骤,那么一切都很好。

我很困惑。这可能是个错误吗?


更新

我尝试使用NSZombie找出导致错误的原因。这是我在控制台中看到的:

MyApp[14402:207] *** -[UIWebDocumentView isKindOfClass:]: message sent to deallocated instance 0x200a800

我的代码不多;单元格在界面构建器中创建。这是调出modalViewController

的方法
- (void)createNewEntry:(id)sender {

CreateNewEntryViewController *createNewEntryVC = [[CreateNewEntryViewController alloc] initWithNibName:@"CreateNewEntryViewController" bundle:nil];
createNewEntryVC.delegate = self;

UINavigationController *createNewEntryNavigationController = [[UINavigationController alloc] initWithRootViewController:createNewEntryVC];
[createNewEntryVC release];

[self presentModalViewController:createNewEntryNavigationController animated:YES];
[createNewEntryNavigationController release];   }

7 个答案:

答案 0 :(得分:1)

最终编辑:

我找到了问题的解决方案,也许它也会解决你的问题。 (看看我对这个问题的回答:) UIButton, created by Interface Builder, is crashing

具体来说,如果您的按钮有任何图像,请尝试从项目中删除它们,获取新副本,重命名它们,将它们重新添加到项目中,然后再将它们挂起。似乎在我的案例中有效。


我之前的随机性:

(不是答案,但是......)对于它的价值,我收到了类似的信息。也许添加我所看到的可能有助于弄清楚这一切。我在模拟器和设备上都得到了这个。

-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0

这条消息对我来说并不总是一致的,有时候它会保留一个无效的实例或其他一些类似的东西。这些都不是我自己做的事情,而是幕后的事情。

编辑:这是另一个:

-[UIImage retain]: message sent to deallocated instance 0x3b621a0

这是我要被转储的代码(就像你,我正在显示一个模态对话框,虽然我的是自定义UIView)。在我的情况下,我强迫运行循环等待用户响应,如下所示:

[modalDialog showInView:self.view
                  title:@"Illegal Move"
                message:message 
             cancelText:@"Cancel" 
            proceedText:@"Cheat"];

while (waitingForDialogToDismiss == YES) {
    //this line is where NSZombies puts me:
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode 
                             beforeDate: [NSDate dateWithTimeIntervalSinceNow:1.5]];
}

这个模态对话框完全由笔尖构建,并且有几个按钮图像并且几乎总是正确显示。但是,如果我尝试通过在出现之前点击许多不同的UI元素来“匆匆忙忙”,我可以在30-40%的时间内得到此错误。有一次,即使对话框出现,其“取消”按钮的图形也是错误的。

看起来似乎并不总是正确地加载所有内容,或者可能是及时加载。

目前,我将尝试重写一堆代码以删除NSRunLoop业务。我们会看到。

编辑2:没有帮助

NSRunLoop肯定不是问题。我把它缩小了很多,并在这里开始了一个新问题:UIButton, created by Interface Builder, is crashing

答案 1 :(得分:1)

我有同样的问题(或一个非常相似的问题)。

在我的情况下发生了崩溃,因为我已经实现了UITextView委托方法textViewShouldEndEditing:始终返回NO。

答案 2 :(得分:1)

就我而言,我使用的是CustomTextView,如下所述:http://www.iphonedevsdk.com/forum/iphone-sdk-development/4864-adding-border-uitextview.html

问题是[backgroundImage release];行。它应该是[myImageView release];

我知道这与原来的问题相去甚远,但我的搜索引导我到这里,所以希望这有助于将来。

答案 3 :(得分:1)

我有同样的问题,我的应用程序因为TableView数据源方法崩溃,请确保行或标题的视图不是autorelease.I通过删除自动释放修复

答案 4 :(得分:0)

在这种情况下,我通常会开始注释掉代码,直到它停止破坏为止。然后你知道问题出在哪里。我将从CreateNewEntryViewController中的任何发布语句开始,即使是那些看似平凡的语句

答案 5 :(得分:0)

这肯定是一个内存管理问题,正如coneybeare所说,很可能是CreateNewEntryViewController释放其对象的方式的问题。

问题:

  1. dealloc方法是什么? CreateNewEntryViewController看 样的?
  2. 你为什么要创建一个新的 UINavigationController实例 这里?听起来像你的主要 tableViewController已经在了 UINavigationController,为什么要创建一个 新来的?
  3. 如果您在操作顺序中省略第4步(不要再次点击添加按钮,只需在取消模态视图控制器后等待),应用程序是否会崩溃?
  4. 另外,如果您可以发布更多代码,那将会有所帮助。

    可能值得追求的另一件事是,正如已经建议的那样,开始简化/评论代码直到它工作,然后回溯你的步骤。也许开始从你的IB文件中删除对象,只用一个取消按钮使CreateNewEntryViewController变为空白,看看是否有效。

答案 6 :(得分:0)

如果您不小心在模态控制器的dealloc方法中调用[delegate release],也会发生这种情况。您的模态控制器将退出,但您将在父控制器中遇到错误的访问崩溃。通常你使用类似的东西:

@property(nonatomic,assign)id delegate;

在你的实现中用@synthesize覆盖它但不释放它 - 你的模态VC没有副本。