1

我有一个应用程序,我正在尝试为聊天应用程序实现 LibPusher API。

该 API 已启用 arc,我已将其包含在我的 nonarc 项目中。
除了一些警告外,它工作正常。

现在我的问题是我在导航栏中添加了一个按钮,如下所示:

UIButton *btnNext1 =[[UIButton alloc] init];
    [btnNext1 setBackgroundImage:[UIImage imageNamed:@"back_btn.png"] forState:UIControlStateNormal];

    btnNext1.frame = CGRectMake(100, 100,60, 31);
    UIBarButtonItem *btnNext =[[UIBarButtonItem alloc] initWithCustomView:btnNext1];
    [btnNext1 addTarget:self action:@selector(backButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = btnNext;
    [btnNext1 release];

它工作正常,在行动中我正在这样做:

PusherPresenceEventsViewController *rootView = ( PusherPresenceEventsViewController*)[self.navigationController.viewControllers objectAtIndex:1];
rootView.newmessage =@"";
[self.navigationController popToViewController:rootView animated:YES];
[rootView release];

前两次也可以正常工作。
但是,第三次出现错误的访问错误。
我不明白我哪里出错了,有人可以帮助我吗?

4

2 回答 2

3
UIButton *btnNext1 =    [UIButton buttonWithType:UIButtonTypeCustom]

并且不要释放它。同时释放 Rootview,因为你没有分配它。

于 2012-10-22T14:00:33.540 回答
3

正如 iProgrammer 正确识别的那样,问题在于您正在发布您不拥有的东西(根据基本内存管理规则alloc,您只能“拥有”通过以、newcopy和开头的方法创建的那些东西mutableCopy)。删除[rootView release],您的问题应该会消失。

顺便说一句,我建议通过静态分析器运行您的代码(在“产品”菜单上选择“分析”,或按shift+ command+ B)。您应该有分析器生成的警告。这个额外release是分析器可能会引起您注意的问题的一个示例。静态分析器非常擅长发现各种可能困扰非 ARC 代码的基本内存管理问题。

于 2012-10-22T15:24:27.453 回答