运行popToRootViewControllerAnimated 返回最上层后,dealloc运行报错。

五虎将 2015-05-12 11:41:01
代码如下:
@interface A : UIViewController <UITextFieldDelegate>
{
UITextField *inputName;
}

@property (nonatomic,retain) UITextField *inputName;

@end


....m文件
@implementation A

@synthesize inputName;

- (void)dealloc
{
if(inputName != nil)
{
[inputName release];
inputName = nil;
}
[super dealloc];
}
//A类的dealloc函数调用后报错。EXC_BAD_ACCESS(code = 1,address=0xd000000c)

pushViewController代码如下:
aa = [[A alloc] init];
[self.navigationController pushViewController:aa animated:YES];
[aa release];
aa = nil;

popToViewController 代码如下:
NSArray *array = self.navigationController.viewControllers;
B *app = (B *)([array objectAtIndex:[array count] - 3]);
[self.navigationController popToViewController:(UIViewController *)app animated:YES];
//[self.navigationController popToRootViewControllerAnimated:YES];

在执行popToViewController 或popToRootViewControllerAnimated,返回最顶层后,A类的dealloc函数调用到了,然后报错。EXC_BAD_ACCESS(code = 1,address=0xd000000c)错误
在init里面 inputName = [[UITextField alloc]initWithFrame:CGRectMake(10, Img.size.height + Img.size.height / 2, Img.size.width,Img.size.height)];
inputName.delegate = self;
[self.view addSubview:inputName];
[inputName release];
在这个地方inputName release有什么问题吗?如果我把[inputName release];这条语句去掉,dealloc里面就不报错了,我跑了retainCount语句,addSubview之后retainCount是2,在 dealloc里面retainCount输出也是2,我的整个做法哪里有问题吗?
...全文
764 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
五虎将 2015-05-12
  • 打赏
  • 举报
回复
嗯。谢谢。在按你说的做法改代码之前,我用zombie检测出了一个问题, output给出的提示正是向一个已经被销毁的对象发送release
ReyZhang 2015-05-12
  • 打赏
  • 举报
回复
引用 6 楼 tankweight 的回复:
[quote=引用 4 楼 zhanglei5415 的回复:] [quote=引用 2 楼 tankweight 的回复:] addSubview后不是要release吗?我这边addSubview 后NSLog retain count是输出为 2。
引用 3 楼 tankweight 的回复:
谢谢,我在做的项目关闭了ARC。addSubview后不是要release吗?
我可能分析的有误,确实在addSubview之后,对象又多了一个持有者-- self.view ,retainCount 为2 。 你可以尝试用我给你办法,看不没有内存问题。 [/quote] 但是我我开启了Enable Zombie Objects之后,登陆界面那边却没有出现问题,我在做的项目里面有一个登录界面,我也是在addSubView后release了,然后dealloc里面也 release, 然后nil,output里面却没有给出错误。[/quote] Zombie 可以用来检测“僵尸对象” 。 僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用
五虎将 2015-05-12
  • 打赏
  • 举报
回复
引用 4 楼 zhanglei5415 的回复:
[quote=引用 2 楼 tankweight 的回复:] addSubview后不是要release吗?我这边addSubview 后NSLog retain count是输出为 2。
引用 3 楼 tankweight 的回复:
谢谢,我在做的项目关闭了ARC。addSubview后不是要release吗?
我可能分析的有误,确实在addSubview之后,对象又多了一个持有者-- self.view ,retainCount 为2 。 你可以尝试用我给你办法,看不没有内存问题。 [/quote] 但是我我开启了Enable Zombie Objects之后,登陆界面那边却没有出现问题,我在做的项目里面有一个登录界面,我也是在addSubView后release了,然后dealloc里面也 release, 然后nil,output里面却没有给出错误。
五虎将 2015-05-12
  • 打赏
  • 举报
回复
是的,按你说的改了代码后,我开启了Enable Zombie Objects,没有给出错误信息了。关闭调试,实机运行,这个View界面反复调用后没出问题。
ReyZhang 2015-05-12
  • 打赏
  • 举报
回复
引用 2 楼 tankweight 的回复:
addSubview后不是要release吗?我这边addSubview 后NSLog retain count是输出为 2。
引用 3 楼 tankweight 的回复:
谢谢,我在做的项目关闭了ARC。addSubview后不是要release吗?
我可能分析的有误,确实在addSubview之后,对象又多了一个持有者-- self.view ,retainCount 为2 。 你可以尝试用我给你办法,看不没有内存问题。
五虎将 2015-05-12
  • 打赏
  • 举报
回复
谢谢,我在做的项目关闭了ARC。addSubview后不是要release吗?
五虎将 2015-05-12
  • 打赏
  • 举报
回复
addSubview后不是要release吗?我这边addSubview 后NSLog retain count是输出为 2。
ReyZhang 2015-05-12
  • 打赏
  • 举报
回复
还在使用MRR(manual retain-release)? 建议使用ARC 来帮你管理内存 问题也很明显。你把inputName定义成属性property,那么建议你使用self.propertyname 来使用属性,这是因为属性可以帮助我们来管理内存。这就需要你了解系统默认为属性生成的setter 方法内部是如何处理的。 你的代码中:

 inputName = [[UITextField alloc]initWithFrame:CGRectMake(10, Img.size.height + Img.size.height / 2, Img.size.width,Img.size.height)];
inputName.delegate = self;
 [self.view addSubview:inputName];
 [inputName release];
inputName 在初始时,它的引用计数为1,没有问题。 在这段代码末尾,你向inputName 发送了release消息,这时inputName指向的对象的引用计数为0,系统会释放该对象所占的内存,但inputName变量中还保存着UITextField对象的地址,但地址指向 的对象已经释放了,那么此时的inputName 就是一个“野指针”,它指向的内存已经不属于这个程序。 所以如果在程序的其它位置再尝试去访问这个“野指针”时就会报错了。 正确的做法是:
self.inputName =[[[UITextField alloc]initWithFrame:CGRectMake(10, Img.size.height + Img.size.height / 2, Img.size.width,Img.size.height)] autorelease];
self.inputName.delegate = self;
[self.view addSubview:self.inputName];

-(void)dealloc {
     [inputName release]; 
     inputName = nil; 
     [super dealloc]; 
}

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧