Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIPopoverController中的内存崩溃_Objective C_Ios_Ipad_Memory Management_Uipopover - Fatal编程技术网

Objective c UIPopoverController中的内存崩溃

Objective c UIPopoverController中的内存崩溃,objective-c,ios,ipad,memory-management,uipopover,Objective C,Ios,Ipad,Memory Management,Uipopover,我现在已经花了好几天的时间试图弄清楚到底发生了什么,而我的一生都看不出我做错了什么。当用户触摸屏幕上的某个点时,我弹出一个UIPopover。popover有一个选项卡控制器和表视图,显示关于该点的信息。但当popover被驳回时,它崩溃了,声称: -[UIAnimator removeAnimationsForTarget:]:发送到解除分配实例的消息 以下是加载视图控制器的代码: MyViewController *popView = [[MyViewController alloc] in

我现在已经花了好几天的时间试图弄清楚到底发生了什么,而我的一生都看不出我做错了什么。当用户触摸屏幕上的某个点时,我弹出一个UIPopover。popover有一个选项卡控制器和表视图,显示关于该点的信息。但当popover被驳回时,它崩溃了,声称: -[UIAnimator removeAnimationsForTarget:]:发送到解除分配实例的消息

以下是加载视图控制器的代码:

MyViewController *popView = [[MyViewController alloc] init];
myPop = [[UIPopoverController alloc] initWithContentViewController:pop];
[popView release];
myPop.delegate = self;
[airportPop setPopoverContentSize:popView.view.frame.size];
[airportPop presentPopoverFromRect:CGRectMake(location.x,location.y,1,1) inView:self.mainView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

- (void)dismissPopover {
    if( myPop != nil ) {
        [myPop dismissPopoverAnimated:YES];
        [myPop.delegate popoverControllerDidDismissPopover:airportPop];
    }
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [myPop release];
    myPop = nil;
}
实际的MyViewController只是一个UIViewController,它具有(为简洁起见进行了删节)init:

Dealloc只不过是[super Dealloc],因为一切基本上都由视图所有,视图控制器将负责。当myPop被发布时,在DidDismissPopover中,视图也被发布,所以这似乎可以正常工作。但很快,我就崩溃了

当弹出窗口关闭时,我是否需要做一些特殊的操作来放弃选项卡视图或表视图

我正在对表格中的单元格使用自动释放,我应该停止吗

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
提前感谢您的帮助!!!非常感谢您的任何想法


-Kevin

在您的执行表信息->参数选项卡->环境变量中添加以下键

NSZombieEnabled = YES

CFZombie = 5

MallocStackLoggingNoCompact = 1
然后,当你自动崩溃时,你会收到一条消息 像这样的东西

(gdb)继续

2011-06-09 11:46:08.404测试 释放]:发送到解除分配实例0X64a4900的消息

然后键入

(gdb)信息malloc历史0x64a4900

它会给你完整的历史

也许它能帮你找到那个地方


您还可以在崩溃时使用where命令。

[myPop dismissPopoverAnimated:YES]
将继续访问对象,即使在方法调用之后也是如此,因为您为动画设置了
YES
(引擎盖下有一个计时器和其他东西来执行动画)

因此,您可以将其标记为自动释放以推迟此操作,而不是立即释放该对象,这实际上可能会解决问题,也可能不会解决问题

或者将发布推迟一段时间,以确保动画完成。您可以使用GCD(如果您使用的是iOS 4+),因为UIKit中动画的默认时间是0.3s,下面的代码应该可以实现这一点

double delayInSeconds = 0.3;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [myPop.delegate popoverControllerDidDismissPopover:airportPop];
});
编辑:您应该仅将此时间用于测试建议,因为这远远不是发布对象的正确方式


您应该存储指向您的
UIPopover
的指针,并在类
dealloc
方法中释放它。

避免等待动画结束的最快方法是在关闭弹出窗口或Popover委托方法后立即设置
popoverController.delegate=nil

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController

被称为。

这就是我在UIAnimator中知道它的原因。。每次调用的“released class”都会有所不同,但通常在崩溃时会尝试访问表或选项卡视图。是否有方法在lldb中使用此调试工具?是-就是这样。。。将“动画”设置为“否”似乎可以完全解决崩溃问题。(使用自动释放没有。)所以,这是有道理的,但如何知道何时保存以释放popover?顺便说一句,0.3秒不起作用。。我把它设置为5,从那以后就再也没有崩溃过。这对程序关闭的弹出窗口不起作用。从苹果方面来说,不提供完整的回调或调用“didDismissPopover”调用是相当愚蠢的。
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController