我有一个应用程序,我正在尝试为聊天应用程序实现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];
前两次也正常工作 但是,它第三次出现了错误的访问错误 我不明白我哪里出错了,有人能帮助我吗?
答案 0 :(得分:3)
UIButton *btnNext1 = [UIButton buttonWithType:UIButtonTypeCustom]
并且不要发布它。也可以释放Rootview,因为你没有分配它。
答案 1 :(得分:3)
正如iProgrammer正确识别的那样,问题是你发布了一些你不拥有的东西(根据basic memory management rules,你只拥有“你自己”通过alloc
开头的方法创建的东西。 ,new
,copy
和mutableCopy
)。移除[rootView release]
,您的问题就会消失。
顺便提一下,我建议通过静态分析器运行代码(在“产品”菜单上选择“分析”,或按 shift + 命令 + 乙)。您应该有分析器生成的零警告。这个额外的release
是分析器可能引起您注意的那种问题的一个例子。静态分析器非常适合发现各种基本的内存管理问题,这些问题往往会困扰非ARC代码。