ios - static变量内存释放问题
巴扎黑
巴扎黑 2017-04-17 11:31:45
[iOS讨论组]

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

巴扎黑
巴扎黑

全部回复(4)
大家讲道理

首先,你声明了一个静态的指针变量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,也可能是一个合法地址,也可能是一个非法地址。

PHPz

static变量只需要init一次,

static ClassA *var = nil;

//在初始化方法中先init这个static对象。
if(!var)
{
    var = [[ClassA alloc] init];
}

如果你的变量一直要在程序运行期间存在,就不需要release。
如果变量有一定的生命周期,结束时释放一次。

-(void)destory
{
    var = nil;
}

你得到EXC_BAD_ACCESS,要么是没init var,要么是var已经被释放,看你的代码,var没init就直接调用了。

天蓬老师

看你的代码,并没有对var进行初始化,相当于是个空对象,之后调用[var complete];当然会崩溃。static 声明的变量是静态的,变量本身占用的内存(指针占用的内存)是程序结束后释放。而变量指向的对象,在生命周期结束后被释放。

伊谢尔伦

个人见解,你是静态变量,由于你返回的实例是autorelease的,所以需要retain一次,到最后再自己release

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号