您好,匿名用户
随意问技术百科期待您的加入

static变量内存释放问题

0 投票

A.m中
声明一个static变量

static ClassA *var = nil;

有一个实例方法

-(void)dosomething
{
  var = [self create];
  ...
}

方法create定义为

- (ClassA *)create
{
  ClassA *ret = [ClassA methodA];//返回autorelease对象
  return ret;
}
dosomething方法执行一系列操作之后,调用方法
- (void)somethingFinished
{
  [var complete];//crash,提示EXC_BAD_ACCESS
}

显示是内存问题,以上情况是需要在create方法中retain一下吗?
想问下对于static变量,如果控制它的内存释放。

用户头像 提问 2014年 2月23日 @ Leo 上等兵 (255 威望)
分享到:

1个回答

0 投票
 
最佳答案

首先,你声明了一个静态的指针变量var,也就是在内存里申请了4个字节的空间(假设是在32位机器上运行),并且,你给这个空间填入了一个空值:

var => nil;

然后,在doSomething方法里,你创建了一个autorelease的对象,并且把这个对象的地址填到了var所在的空间里:

var => [ClassA methodA];

在doSomething方法结束后,更准确点说,是在一个事件循环完成后,autorelease的对象被释放了,它所在的地址变成了一个不允许访问的地址,而var变量因为你没有动过它,所以它还忠实地保存着这个地址:

var => 非法地址

最后,你试图去访问这个地址的时候,崩溃了:

[var complete];//crash,提示EXC_BAD_ACCESS

这个问题跟var是否静态变量没有关系。静态变量无法被释放,var本身所分配的4个字节空间永远都在那里。只不过,这4个字节表示的地址有可能是一个nil,也可能是一个合法地址,也可能是一个非法地址。

用户头像 回复 2014年 2月23日 @ Graves 上等兵 (254 威望)
选中 2013年 9月7日 @Leo
提一个问题:

相关问题

0 投票
1 回复 37 阅读
用户头像 提问 2013年 12月25日 @ Dr. Mundo 上等兵 (281 威望)
+2 投票
2 回复 105 阅读
用户头像 提问 2012年 12月1日 @ Udyr 上等兵 (341 威望)
0 投票
1 回复 40 阅读
用户头像 提问 2013年 9月21日 @ Caster 上等兵 (256 威望)
0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Janna 下士 (667 威望)
0 投票
1 回复 39 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...