2 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個贊
首先,你聲明了一個靜態(tài)的指針變量var,也就是在內(nèi)存里申請了4個字節(jié)的空間(假設(shè)是在32位機(jī)器上運(yùn)行),并且,你給這個空間填入了一個空值:
var => nil;
然后,在doSomething方法里,你創(chuàng)建了一個autorelease的對象,并且把這個對象的地址填到了var所在的空間里:
var => [ClassA methodA];
在doSomething方法結(jié)束后,更準(zhǔn)確點(diǎn)說,是在一個事件循環(huán)完成后,autorelease的對象被釋放了,它所在的地址變成了一個不允許訪問的地址,而var變量因?yàn)槟銢]有動過它,所以它還忠實(shí)地保存著這個地址:
var => 非法地址
最后,你試圖去訪問這個地址的時候,崩潰了:
[var complete];//crash,提示EXC_BAD_ACCESS
這個問題跟var是否靜態(tài)變量沒有關(guān)系。靜態(tài)變量無法被釋放,var本身所分配的4個字節(jié)空間永遠(yuǎn)都在那里。只不過,這4個字節(jié)表示的地址有可能是一個nil,也可能是一個合法地址,也可能是一個非法地址。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個贊
static變量只需要init一次,
static ClassA *var = nil;//在初始化方法中先init這個static對象。if(!var) { var = [[ClassA alloc] init]; }
如果你的變量一直要在程序運(yùn)行期間存在,就不需要release。
如果變量有一定的生命周期,結(jié)束時釋放一次。
-(void)destory { var = nil; }
你得到EXC_BAD_ACCESS,要么是沒init var,要么是var已經(jīng)被釋放,看你的代碼,var沒init就直接調(diào)用了。
- 2 回答
- 0 關(guān)注
- 405 瀏覽
添加回答
舉報(bào)