この奇妙な動作を知りたいだけですNSString *temp
.hファイルを宣言していて、viewDidLoad
メソッドでそれを印刷しようとするとNSLog(@"%@,temp")
、null velueが表示されますがNSLog(@"%@",temp)
、アプリがクラッシュしてアクセスが悪いと言ってクラッシュする前に、この変数を宣言すると、誰も私にこれを説明できますか?
3 に答える
インスタンス変数として宣言された変数は、デフォルトで 0 に設定されますが、ローカル変数はそうではありません。つまり、通常、無効なデータ/ポインターが含まれています。それらにアクセスすると、クラッシュが発生します。
編集: int 値を試すことができます - それらはクラッシュしませんが、その値を表示します。または、オブジェクトのポインター値をダンプします。
NSString を ivar として宣言すると、デフォルトで値は nil になります。したがってNSLog(@"%@", temp)
、null が表示されます。しかし、ローカル変数はデフォルトの初期値を取得せず、むしろガベージ値を含んでいます。したがって、この場合NSLog(@"%@", temp)
は無効なアドレスにアクセスしようとしているため、不正なアクセスが発生しています。これはデバッガで確認できます。ivar には nil が表示されますが、ローカル文字列にはガベージ値が表示されます。
編集: ivar は、クラスのインスタンス メンバー変数を意味します。@interface
これらの変数をブロックで宣言します。それらは、クラスやメソッドの外部で宣言されたグローバル変数と同じではありません。グローバル変数はコードのどこからでもアクセスできますが、インスタンス変数はクラス内でアクセスできます (もちろん、セッター/ゲッターを定義していない場合)。クラッシュに関する問題は、プログラムの一部ではないメモリにアクセスしようとするとクラッシュすることです。初期化されていない変数にガベージ値が含まれています。
NSString *str;
これを初期化されていないと考えてくださいstr
。ガベージ値が含まれているとします0x130154d0
。したがって、書き込み時に、プログラムにとって無効なNSLog(@"%@", str)
オブジェクトにアクセスしようとしており、クラッシュします。0x130154d0
この変数をクラス (ivar) のインスタンス メンバー変数として宣言すると、コンパイラによってnil
. その場合null
、クラッシュの代わりに表示されます。
これは、ivar が typs に基づいてデフォルトで 0 = nil = NULL に初期化されるために発生します。自動的。反対側のローカル変数を最初に初期化する必要があります。
私は、あなたはこのようにしていたと思います。
NSString* myName;
//in this case it'll give the warning VARIABLE "myName" IS UNINITIALIZED WHEN USED HERE.
NSLog(@"%@",myName)
nil
何らかの値を割り当ててもクラッシュしません。したがって、このようにする必要があります。
NSString* myName= nil;
NSLog(@"%@",myName);
それがあなたをクリアすることを願っています。