开发者社区> 问答> 正文

static变量内存释放问题

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变量,如果控制它的内存释放。

展开
收起
a123456678 2016-07-20 14:47:22 2423 0
1 条回答
写回答
取消 提交回答
  • 首先,你声明了一个静态的指针变量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,也可能是一个合法地址,也可能是一个非法地址。
    2019-07-17 19:58:52
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载