どのように私はObjective Cの中に初期化されていない値を設定するのですか?
-
06-09-2019 - |
質問
この質問は基本オフになる場合もありますが、ここで私がいる問題があります:
私は、iPhone SDKのサンプルを実行しようとしている、と私は、アクセス違反に実行していますよ。私は疑わしいと思い、いくつかの行動を下にトレースしてきます。
ここでは、クラスは次のようになります。
@interface TableViewCell : UITableViewCell {
@private
UILabel *_earthquakeLocationLabel;
UILabel *_earthquakeDateLabel;
UILabel *_earthquakeMagnitudeLabel;
UIImageView *_magnitudeImageView;
}
私はブレークポイントを設定すると、
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier
とデバッガで「自己」を見て、それは_earthquakeDateLabelは「0x12を」であることを示し、_earthquakeMagnitudeLabelは0x1000番地で、他の2つはゼロです。私はゼロ以外のもののいずれかに割り当てようとする場合は、私がアクセス違反を取得します。
私は何が起こっているかを推測しているこれらは、それらの中に偽の値を持っている、と私は彼らに割り当てようとするとき、それは偽の値の参照をデクリメントしようとすると、最大吹くということです。私が言ったようにしかし、私はObjective Cのにかなり新しいので、私は基本ずれることがあります。
だから私の質問は、私がやるべきこと、これらの値を初期化に関する特別なことはありますか?それはそれで偽の値を持つときの値に割り当てるには?
または任意の方法 <時間>いくつかの追加情報:
私は初期化に_earthquakeDateLabelと_earthquakeMagnitudeLabelにnilを割り当てるのであれば、、それが問題を修正します。しかし、私は、オブジェクトがそれらのフィールドの値を使用して作成された理由を理解していません。私は彼らがnilであることを期待しています。オブジェクトはヒープ上に作成されています:
TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
正しい解決策はありません
他のヒント
self
ポインタが偽であるようですね。値0x12をし、0x1000番地は整数定数です。彼らは間違いなく有効なメモリアドレスへのポインタしていません。あなたはそれらの値を見ているという事実は、何かが間違っている、と悪になります(読み取りまたはそれらを書いて)どのような方法でそれらを操作しようとしていることを示しています。無効なアドレスであるメモリ・アドレス0x12をし、0x1000番地に書き込むしようとしているので、このケースでは、アクセス違反を取得している。
どのようにTableViewCell
オブジェクトを作成していますか?あなたはTableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]
をやっていますか?それは正しい方法です。
今、私は私の精神的なデバッガを起動するつもりです:私のの推測のあなたは、ポインタを使用してTableViewCell
オブジェクトを宣言するために忘れていることである、(あなたがTableViewCell myCell
の代わりTableViewCell *myCell
としてそれを宣言している、すなわち、 )アスタリスクの存在に注意してください。これは代わりに、ヒープのスタック上のオブジェクトを作成し、その結果として、それはそのデータメンバーで、代わりにゼロのゴミを持っています。 Objective-Cのオブジェクトは、適切に割り当てられた場合、NULL
する呼び出しが成功した後に(データの種類に応じて、またはnil
、false
又はalloc
)を0に初期化され、それらのデータ・メンバの全てを有することになる。