1.MRC下給一個已經(jīng)銷毀的對象就會崩潰贾节,
NSObject *object = [[NSObject alloc]init]; NSLog(@"釋放前------%lu",[object retainCount]); [object release]; // 會崩潰,報錯: EXC_BAD_ACCESS (code=1, address=0x3d92e8185228) NSLog(@"釋放后------%lu",[object retainCount]);
2.向nil對象發(fā)送消息就沒問題
NSObject *object = [[NSObject alloc]init]; NSLog(@"釋放前------%lu",[object retainCount]); object = nil; NSLog(@"釋放后------%lu",[object retainCount]);
注意: objc在向一個對象發(fā)送消息時袖肥,runtime庫會根據(jù)對象的isa指針找到該對象實(shí)際所屬的類火欧,然后在該類中的方法列表以及其父類方法列表中尋找方法運(yùn)行棋电,然后在發(fā)送消息的時候,objc_msgSend方法不會返回值苇侵,所謂的返回內(nèi)容都是具體調(diào)用時執(zhí)行的赶盔。那么,如果向一個nil對象發(fā)送消息榆浓,首先在尋找對象的isa指針時就是0地址返回了于未,所以不會出現(xiàn)任何錯誤。
這里就要區(qū)分空指針和野指針,
野指針:已經(jīng)銷毀被釋放的對象沉眶,指針指向的內(nèi)存已經(jīng)不可用打却,稱為野指針;
野指針非常危險谎倔,所以一個好的做法是把他置為nil;
空指針:對象被賦值為nil柳击,被稱為空指針。