Iphone modalViewController错误。我所遇到的最奇怪的事情

Iphone modalViewController错误。我所遇到的最奇怪的事情,iphone,objective-c,cocoa-touch,uitableview,Iphone,Objective C,Cocoa Touch,Uitableview,我被我在程序中遇到的一个奇怪的错误逗乐了 我有一个带有导航栏的tableViewController。当用户单击导航栏上的添加按钮时,会显示一个模式的tableViewController。此viewController在其导航栏上有一个CANCEL按钮(该按钮通过委派解除viewController) tableViewController具有自定义单元格,其中包含UIButtons、UITextField和UITextView 该错误是由以下操作顺序引起的(无其他原因): 我在UIText

我被我在程序中遇到的一个奇怪的错误逗乐了

我有一个带有导航栏的
tableViewController
。当用户单击
导航栏
上的
添加
按钮时,会显示一个模式的
tableViewController
。此
viewController
在其
导航栏上有一个
CANCEL
按钮(该按钮通过委派解除
viewController

tableViewController
具有自定义单元格,其中包含
UIButton
s、
UITextField
UITextView

该错误是由以下操作顺序引起的(无其他原因):

  • 我在
    UITextView
    中键入了一些文本(位于其中一个单元格中)
  • 在不关闭键盘的情况下,我向上滚动
    tableView
  • 我点击取消按钮(这样模态视图控制器被解除)
  • 回到主
    tableViewController
    ,我再次点击
    ADD
    按钮
我得到
exec\u bad\u访问
错误

没有其他原因导致此错误

如果我尝试完全相同的过程,但使用
UITextField
,则一切正常

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

我很困惑。可能是虫子吗


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

MyApp[14402:207] *** -[UIWebDocumentView isKindOfClass:]: message sent to deallocated instance 0x200a800
我没有太多的代码;这些单元是在interface builder中创建的。下面是一个方法,它将打开
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];   }

在这种情况下,我通常会开始注释代码,直到代码停止中断。那你就知道问题出在哪里了。我将从CreateNewEntryViewController中的任何发布语句开始,即使是那些看似平凡的语句,这肯定是内存管理问题,正如coneybeare所说,很可能是CreateNewEntryViewController发布其对象的方式问题

问题:

  • dealloc的方法是什么 CreateNewEntryViewController外观 比如说
  • 你为什么要创建一个新的 UINavigationController实例 在这里听起来像你的主要工作 tableViewController已在中 UINavigationController,为什么要创建 这里有新的吗
  • 如果您省略了操作序列中的第四步(不要再次点击添加按钮,在取消模式视图控制器后等待),应用程序会崩溃吗
  • 此外,如果您可以发布更多的代码,这将非常有用

    另一件可能值得追求的事情是,正如前面所建议的,开始对代码进行简化/注释,直到它起作用,然后再回顾您的步骤。可能开始从IB文件中删除对象,只需单击“取消”按钮即可将CreateNewEntryViewController设置为空白,看看是否有效。

    最终编辑: 我找到了解决我问题的办法,也许它也能解决你的问题。(看看我对这个问题的回答:)

    特别是,如果按钮有任何图像,请尝试从项目中删除它们,获取新副本,重命名它们,将它们重新添加到项目中,然后再次连接它们。似乎对我的情况有效


    我之前的随机性: (不是答案,但…)值得一提的是,我收到了类似的信息。也许加上我所看到的可能有助于解决这一切。我在模拟器和设备上都得到了这个

    -[UIImage isKindOfClass:]:消息发送到解除分配的实例0x1661f0

    这条消息对我来说并不总是一样的,有时是关于保留一个无效的实例,或者一些其他类似的事情。这些都不是我自己在做的事情,而是幕后的事情

    编辑:这里还有一个:
    -[UIImage retain]:发送到解除分配实例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%的时间里得到这个错误。有一次,尽管对话框出现了,但它的“取消”按钮的图形错误

    看起来视图的显示并不总是完全正确地加载所有内容,或者可能不是及时加载

    目前,我将尝试重写一组代码以删除nsrunlop业务。我们拭目以待

    编辑2:没有帮助 nsrunlop绝对不是问题所在。我把范围缩小了很多,并在这里开始了一个新问题:

    我也遇到了同样的问题(或一个非常类似的问题)


    在我的例子中,发生崩溃是因为我实现了UITextView委托方法TextViewShoulDediting:要始终返回编号。

    在我的例子中,我使用了CustomTextView,如下所述:

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


    我知道这与最初的问题相去甚远,但我的搜索将我带到了这里,因此希望这对将来的某人有所帮助。

    如果您在模态控制器的dealloc方法中意外调用[delegate release],也可能发生这种情况。您的模态控制器将退出,但您将在父控制器中遇到错误的访问崩溃。通常,您会使用以下内容:

    @属性(非原子,赋值)id委托


    在您的实现中使用@synthesis覆盖它,但不要发布它——您的模态VC没有副本。

    我也遇到了同样的问题,我的应用程序因为TableView数据源方法而崩溃,请确保