Objective C 中的nil,Nil,NULL和NSNull理解
kenyo網(wǎng)友的原創(chuàng)說(shuō)法是:做IOS開(kāi)發(fā)的估計(jì)都對(duì)Objective-C的內(nèi)存管理機(jī)制很頭疼,一不小心程序就會(huì)出內(nèi)存泄露,我也不例外,前幾天被指針的置nil與release給搞慘了,今和大家詳細(xì)解說(shuō)一下有關(guān)Objective-C中nil與release的區(qū)別與用法。
? ? 首先說(shuō)一下他們兩的作用,nil就是把一個(gè)對(duì)象的指針置為空,只是切斷了指針與內(nèi)存中對(duì)象的聯(lián)系,它對(duì)內(nèi)存的釋放沒(méi)有什么作用;而release才是真正用于內(nèi)存釋放的,release后系統(tǒng)會(huì)將該塊內(nèi)存標(biāo)記為可用(可重新分配)。所以nil并沒(méi)有釋放內(nèi)存,只有release才是真正釋放內(nèi)存。
? ? 二者使用順序,如果沒(méi)有release就直接nil,那么雖然不會(huì)出錯(cuò)(release一個(gè)空指針是合法的),但卻等于自己制造了內(nèi)存泄漏,因?yàn)閚il之后release就已經(jīng)不起作用了,我之前的教訓(xùn)就是一不小心把nil擱在了release之前,所以leak一直報(bào)內(nèi)存泄露。
? ? 相反,如果先release后設(shè)置nil,就不會(huì)出現(xiàn)這樣的問(wèn)題,但是有人就會(huì)問(wèn),release而沒(méi)有設(shè)置nil,會(huì)怎樣?其實(shí)程序可能也不會(huì)報(bào)錯(cuò),但是要知道設(shè)置nil其實(shí)是為了防止指針錯(cuò)亂,因?yàn)橐粋€(gè)對(duì)象在release之后,給它所分配的內(nèi)存就已經(jīng)被釋放了,如果釋放之后不把指針置空的話(huà),系統(tǒng)再誤用到到這個(gè)指針時(shí),那么程序就會(huì)崩潰(此種情況特別容易出現(xiàn)在延時(shí)調(diào)用函數(shù)中),如果釋放之后把它的指針置為空,則即便后面的程序用到該指針,也不會(huì)崩潰。所以O(shè)bjective-C釋放內(nèi)存時(shí)必須先release然后nil。
還有一點(diǎn),在子龍山人的原創(chuàng)文章中有這樣的話(huà):可能有讀者經(jīng)??吹?#xff0c;在我的教程的dealloc函數(shù)里面有這樣的代碼:self.xxx = nil;看到這里,現(xiàn)在你們明白這樣寫(xiě)有什么用了吧?它等價(jià)于[xxx release]; ?xxx = [nil retain];(---如果你的property(nonatomic,retian)xxx,那么就會(huì)這樣,如果不是,就對(duì)號(hào)入座吧)。這就是說(shuō),在使用了@property運(yùn)算符后的類(lèi)變量會(huì)產(chǎn)生set和get方法,而set方法的具體寫(xiě)法是這樣的:
?
-(void) setNames:(NSArray*)names{NSLog(@"setNames");
if (_name != name) {
[_name release];
_name = [name retain]; }
}
原來(lái)的變量和nil比較,不等于就自動(dòng)釋放了,然后再執(zhí)行xxx=[nil retain];語(yǔ)句
?
nil
- nil 是 ObjC 對(duì)象的字面空值,對(duì)應(yīng) id 類(lèi)型的對(duì)象,或者使用 @interface 聲明的 ObjC 對(duì)象。
- 例如: ?
NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something - 定義: ?
// objc.h #ifndef nil # if __has_feature(cxx_nullptr) #?? define nil nullptr # else #?? define nil __DARWIN_NULL # endif #endif // __DARWIN_NULL in _types.h #define __DARWIN_NULL ((void *)0)
?
Nil
- Nil 是 ObjC 類(lèi)類(lèi)型的書(shū)面空值,對(duì)應(yīng) Class 類(lèi)型對(duì)象。
- 例如: ?
Class someClass = Nil; Class anotherClass = [NSString class]; - 定義聲明和 nil 是差不多的,值相同: ?
// objc.h #ifndef Nil # if __has_feature(cxx_nullptr) #?? define Nil nullptr # else #?? define Nil __DARWIN_NULL # endif #endif
NULL
- NULL 是任意的 C 指針空值。
- 例如: ?
int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL; - 定義: ?
// in stddef.h #define NULL ((void*)0)
NSNull
- NSNull 是一個(gè)代表空值的類(lèi),是一個(gè) ObjC 對(duì)象。實(shí)際上它只有一個(gè)單例方法:+[NSNull null],一般用于表示集合中值為空的對(duì)象。
- 例子說(shuō)明: ?
// 因?yàn)?nil 被用來(lái)用為集合結(jié)束的標(biāo)志,所以 nil 不能存儲(chǔ)在 Foundation 集合里。 NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil]; // 錯(cuò)誤的使用 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"someKey"]; // 正確的使用 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNull null] forKey:@"someKey"]; - 定義: ?
/*? NSNull.h ????Copyright (c) 1994-2012, Apple Inc. All rights reserved. */ #import <Foundation/NSObject.h> @interface NSNull : NSObject <NSCopying, NSSecureCoding> + (NSNull *)null; @end
NIL 或 NSNil
ObjC 不存在這兩個(gè)符號(hào)!
小結(jié)
雖然 nil, Nil, NULL 的值相同,理解它們之間的書(shū)面意義才重要,讓代碼更加明確,增加可讀性。
參考資料
- Difference between nil,NIL and null – Stack Overflow
- Topics for Cocoa: Using Null.
object c 中的BOOL值與bool值
typedef?signed?char?BOOL; ?
#define?YES??????(BOOL)?1
#define?NO???????(BOOL)?0
從上面的定義我們發(fā)現(xiàn)布爾變量的值為 YES/NO,或 1/0 。YES 或 1 代表真,NO 或 0 代表假。比如你定義了一個(gè)布爾變量并賦了值:
BOOL enabled = NO;
enabled = 0;
判斷BOOL值為YES:
if(enabled == YES){
}
或者YES可以省略
if(enabled){
}
判斷BOOL值為NO:
if(!enabled){
}
或者
if(enabled != YES){
}
轉(zhuǎn)載于:https://www.cnblogs.com/baozou/p/3304096.html
總結(jié)
以上是生活随笔為你收集整理的Objective C 中的nil,Nil,NULL和NSNull理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 正则表达式贪婪模式及最短匹配
- 下一篇: 使用ioctl向linux内核传递参数的