gpt4 book ai didi

objective-c - UIPopoverController 内存崩溃

转载 作者:可可西里 更新时间:2023-11-01 05:24:47 24 4
gpt4 key购买 nike

我现在已经花了好几天时间试图弄清楚发生了什么,但我终其一生都看不出自己做错了什么。当用户触摸屏幕上的某个点时,我会弹出一个 UIPopover。弹出窗口有一个选项卡 Controller 和 TableView ,用于显示有关该点的信息。但是当弹出窗口被关闭时,它会崩溃并声称:-[UIAnimator removeAnimationsForTarget:]: 发送到释放实例的消息

这是加载 View Controller 的代码:

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,它带有(为简洁起见而删节):

  - (id)init
{
self = [super init];
//create a newview
self.view = popView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, POPUP_WIDTH, POPUP_HEIGHT)];
[popView release];

topBar = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, POPUP_WIDTH, 30)];
....
[popView addSubview:topBar];
[topBar release];

//create a table view
self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 30, POPUP_WIDTH, POPUP_HEIGHT-30-49)];
table.delegate = table.dataSource = self;
....

//create a tab bar
tabBar = [[UITabBar alloc] initWithFrame:CGRectMake(0, POPUP_HEIGHT-49, POPUP_WIDTH, 49)];
tabBar.delegate = self;

[popView addSubview:tabBar];
[popView addSubview:table];

[tabBar release];
[table release];
return( self );
}

Dealloc 只不过是 [super dealloc],因为一切基本上都属于 View , View Controller 会处理它。当 myPop 被释放时,在 DidDismissPopover 中, View 也被释放,所以这似乎工作正常。但此后不久,我就崩溃了。

当弹出窗口关闭时,我是否需要做一些特殊的事情来丢弃选项卡 View 或表格 View ?

我正在表格中的单元格上使用自动释放,我应该停止这样做吗?

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

提前感谢您的帮助!!!非常感谢任何想法!!

-凯文

最佳答案

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

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

或者将发布推迟到您确定动画将完成之后的某个时间。您可以为此使用 GCD(如果您使用的是 iOS 4+)并且 UIKit 中的默认动画时间是 0.3 秒,下面的代码应该可以解决问题。

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 方法中释放它。

关于objective-c - UIPopoverController 内存崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6533675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com