0

虽然我已经解决了这个问题。我真的需要有人向我解释它为什么有效。

UINavBar有一个自定义UIView为可见的 ViewController。我创建了一个自定义按钮来代替导航栏的标题视图并将其设置为autorelease(我正在自定义现有的非 ARC代码):

- (void)loadView {
    ..  

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(presentEmailThreadList)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:[NSString stringWithFormat:@"1 of %d",self.numThreads] forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);

    self.navigationItem.titleView = [button autorelease];
}

当我以模态方式呈现视图时,此代码有效,即:

[self presentModalViewController:emailThreadListVC animated:YES];

EXC_BAD_ACCESS如果我尝试将其推送到导航堆栈,则会出现错误,然后单击新 VC 上的“后退按钮”:

[self.navigationController pushViewController:emailThreadListVC animated:YES];

特别是在以下位置崩溃UINavigationItemTitleView

在此处输入图像描述

我得出的结论是,titleView当我尝试返回原始 VC 时,它不再存在,这意味着当我将 VC 推送到堆栈顶部时,它autorelease确实减少了引用计数,但是titleView当我将引用计数减少时,它不会减少以模态方式推送 VC。

知道为什么吗?

4

1 回答 1

1

问题在这里:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
...
self.navigationItem.titleView = [button autorelease];  <-- DOUBLE AUTORELEASE

buttonWithType已经返回一个自动释放的对象,所以你不需要再次显式地自动释放它。

为什么它在您使用时有效presentViewController是另一个问题。我认为这归结为两种情况下不同的时间安排。

于 2013-01-14T11:05:28.147 回答