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数据源方法而崩溃,请确保