iOSでのnilNSNull nullkCFNullの違い



Difference Between Nil Nsnull Null Kcfnull Ios



で転載 http://blog.csdn.net/xunyn/article/details/8283653
http://www.jianshu.com/p/3aaefb3bcf73
1、nilとnullは文字通り理解しやすく、nilはオブジェクト、NULLは値です。私の理解では、nilはオブジェクトをnullに設定し、nullは基本タイプが空に設定され、個人は属性と少し似ていますが、基本タイプは割り当てられます。NSStringタイプは通常、コピーを割り当て、オブジェクトは通常、保持を使用します。そして、nilのメソッドを呼び出します。クラッシュを生成したり、例外をスローしたりすることはありません。 nilを見てください-> Objective-cオブジェクトへのNullポインタ

NIL-> Null-Objective-cクラスへのポインタ



null->プリミティブ型またはデータの欠如へのnullポインタ。

使用法を見てください



NSURL * url = nil

クラスclass = Nil;

int * pointerInt = NULL;



Nilはオブジェクトポインタが空、Nilはクラスポインタが空、NULLは基本データ型が空です。これらは、nil、Nil、NULLの違いとして理解できます。

2、NSNULL、NULL、およびnilは基本的に同じである必要があり、NULLとnilは実際には0ですが、Objective-cでは、NSArrayなどのタイプの場合、NSArrayが定義されている場合、nilまたはNULLを追加されるオブジェクトとして使用できません。割り当てられたメモリで、その内容を空に設定したい場合は、[NSNULL nullが返されたオブジェクトを使用してNSArrayの内容を初期化できます。C言語のmallocのメモリ空間のように感じます。次に、値を初期化します。 memsetが0のこのスペース。

_viewControllers = [[NSMutableArray alloc] init] for (unsigned i = 0 i <_pages i++) { [_viewControllers addObject:[NSNull null]] } ymBaseController *controller = [_viewControllers objectAtIndex:page] if ((NSNull *)controller == [NSNull null]) { ... } [_viewControllers replaceObjectAtIndex:page withObject:controller]

3、deallocで調査できる問題-(void)dealloc {self.test = nil [_test release] test = nil}これらのいくつかの違いは、最も単純な[_testrelease]です。これは参照手法を1つ減らします。いわゆる参照カウントは、メモリエンティティへのポインタが複数あるかどうかを確認することです。リリースが1回の場合、ポインタは1つ減ります。リリースが0の場合、メモリをシステムに戻すときです。 Self.test = nilプロパティとsetterおよびgetterメソッドを理解するのは難しくありません-(void)setTest:(NSString *)newString {if(_test!= newString)[_ test release] _test = [newString hold]}-(NSString *)test {return _test}これはセッターとゲッターのメソッドであり、この場合、コードをif(_test!= nil)[_ test release] _test = nilに変更するのと同じです。簡単に説明できます。 setterメソッドはnilオブジェクトを保持します。その前に、古いオブジェクトがリリースされています。この方法の利点は、メンバー変数がランダムデータを指す機会がないことです。他の方法では、それは可能です。ランダムデータの場合を指すが表示されます。リリース後、別の方法でアクセスする場合、deallocされているとクラッシュする可能性があり、nilをポイントした後はエラーは発生しません。 Nilは、カウンターが0であると言いました。つまり、オブジェクトが実際に解放されると、NSLogはそれが指すメモリ制御を出力できず、nilの場合、ポイントされるメモリスペースを出力できます。したがって、test = nilを説明するのは難しくありません。この単純な使用法は、メモリリークを自分で作成すると言えます。これは、ここで理解できますが、オブジェクトへのポインタに直接相当し、オブジェクトが壊れています。テストポイントを直接nilにすると、メモリエンティティが消えることはなく、システムのリサイクルもありません。

stackOverflowの例を見てみましょう:

if (nameTextField.text != (id)[NSNull null] || nameTextField.text.length != 0 ) { NSString *msg = [[NSString alloc] initWithFormat:@'Hello, %@', txtName.text] [lblMessage setText:msg] }

結果:nameTextField.textが空であるかどうかに関係なく、if条件文が入力されます。
エラーは次のとおりです。nameTextField.text空の場合、(id)(NSNull null)ではなく== nilなので、とにかく、nameTextFiled!=(id)[NSNullnull]はtrueです。

まず、これらのnull値の定義を見てみましょう。

Nil:nullインスタンスのID、(インスタンス)オブジェクトへのnullポインタを定義します
例えば:
NSString * msg = nil
NSDate * date = nil
Nil:クラスのnullポインターを指す、nullクラスのIDを定義します
例えば:
クラスclass = Nil
NULL:他のタイプ(基本タイプ、Cタイプ)のnullポインターを定義します
char * p = NULL
NSNull:配列内の要素のプレースホルダー。データ内の要素をnilにすることはできません(空にすることもできます。つまり、NSNullにすることもできます)。
原因:nilは配列の終わりです
nilを使用すると、

NSArray *array = [NSArray arrayWithObjects: [[NSObject alloc] init], nil, [[NSObject alloc] init], [[NSObject alloc] init], nil],

次に、配列は2番目の位置で終了します。 [配列数]を印刷すると、5ではなく1が表示されます
kCFNull:NSNullのシングルトン
CoreFoundationにはkCFNullの定義がありますが、これは実際にはNSNullのシングルトンです。

typedef const struct CF_BRIDGED_TYPE(NSNull) __CFNull * CFNullRef CF_EXPORT CFTypeID CFNullGetTypeID(void) CF_EXPORT const CFNullRef kCFNull // the singleton null instance NSNull *null1 = (id)kCFNull NSNull *null2 = [NSNull null] Talking is cheap ,show me the code! NSLog(@'nil is %p',nil) NSLog(@'Nil is %p',Nil) NSLog(@'Null is %p',NULL) NSLog(@'nil is %@',nil) NSLog(@'NSNULL is %@',kCFNull) nil is 0x0** Nil is 0x0** Null is 0x0** nil is (null)** NSNULL is **

主な違いは、nilシステムとNSNullシステムの違いです。

Nil:オブジェクトとしてのnullポインタと配列の終わり
NSNull:配列のnullプレースホルダーとして

私はこの記事を何度も改訂しました。学習が深まるにつれて、いくつかの初期の理解は間違っています! ! !
たとえば、このコード

Class class = nil Class class1 = Nil char *p =nil char *p1 = NULL NSString *str = NULL NSLog(@'nil is : %d',class==nil) NSLog(@'nil is : %d',class==Nil) NSLog(@'Nil is : %d',class1==nil) NSLog(@'Nil is : %d',class1==Nil) NSLog(@'integer is nil : %d',num == nil) NSLog(@'integer is NULL : %d',num == NULL) NSLog(@'integer is Nil : %d',num == Nil) NSLog(@'nil equals Nil: %d',nil == Nil) NSLog(@'Nil equals NULL:%d',p == p1) NSLog(@'nil equals NULL: %d',nil == NULL)

結果はすべて1なので、見てください。基本的にnil、Nil、NULLは同じです。
->スマート、上記のエラーコードを見つけることができますか? ? ?
次の説明を見てください
Objective-Cでは、オブジェクトとプリミティブ型を区別することが重要です。
アン オブジェクト 常にポインタとして保存されます。これは、メモリ内のオブジェクトの場所です。ポインタは単なる数字です。 NSLogでは、%pを使用してこの値を確認できます。次のように、デバッガーでも表示できます:printmyObject。ポインタは、0xの16進数として表示されます
プレフィックス。 nilは基本的にロケーションゼロ(0x0000)です。あらゆる種類のオブジェクトを割り当てると、ゼロではないポインタを取得します。オブジェクトを変数に割り当てるときは、オブジェクトを複製するのではなく、単にメモリアドレスをコピーするだけです。 NSLogを使用すると、%@を使用してオブジェクトの説明を出力できます。
。デバッガーでは、次のようになります。print-objectmyObject

プリミティブ型 NSIntegerのように
オブジェクトではありません。ポインタを格納する代わりに、通常は値を格納するだけです。 NSIntegerを割り当てるとき
変数の場合、値のコピーを作成します。 printを使用してデバッガーで値を確認できます
。またはこのように:NSLog( '%ld'、(long)currentRow)
。プリミティブを割り当てるときは、その値をコピーします。 %@は使用しないでください
またはprint-object
プリミティブを使用—オブジェクトを期待します。