亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

想問下對于static變量,如果控制它的內存釋放?求指點

想問下對于static變量,如果控制它的內存釋放?求指點

iOS
慕容708150 2023-04-24 19:15:26
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一下嗎?
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

首先,你聲明了一個靜態的指針變量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,也可能是一個合法地址,也可能是一個非法地址。


查看完整回答
反對 回復 2023-04-28
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

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就直接調用了。


查看完整回答
反對 回復 2023-04-28
  • 2 回答
  • 0 關注
  • 373 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號