2009-05-30 5 views
0

この質問は基本的ではないかもしれませんが、私が持っている問題は次のとおりです。Objective Cで初期化されていない値を設定するにはどうすればよいですか?

iPhone SDKからサンプルを実行しようとしていますが、アクセス違反が発生しています。私は疑わしいと思う行動をいくつか追跡しました。

はここで、クラスは次のようになります。私は

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier 

にブレークポイントを設定し、デバッガで「自己」を見てみると

@interface TableViewCell : UITableViewCell { 

@private  
    UILabel *_earthquakeLocationLabel; 
    UILabel *_earthquakeDateLabel; 
    UILabel *_earthquakeMagnitudeLabel; 
    UIImageView *_magnitudeImageView; 
} 

、それは_earthquakeDateLabelは「0x12を」であることを示し、 _earthquakeMagnitudeLabelは0x1000で、他の2つはゼロです。非ゼロの値のいずれかに代入しようとすると、アクセス違反が発生します。

私は、これらには偽の値があることを推測しています。割り当てをしようとすると、偽の値の参照を減らして爆発してしまいます。しかし、私が言ったように、私はObjective Cをかなり新しくしています。

私の質問には、これらの値を初期化するための特別なことがありますか?または、それに偽の値があるときに値に割り当てる方法はありますか?


いくつかの追加情報:

私は初期に_earthquakeDateLabelと_earthquakeMagnitudeLabelにnilを割り当てるのであれば、問題を修正します。しかし、私はなぜオブジェクトがそれらのフィールドの値で作成されるのか理解していません。私はそれらが無実だと思う。オブジェクトはヒープ上に作成されている:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; 

答えて

1

selfポインタが偽であるようですね。値0x12と0x1000は整数定数です。彼らは間違いなく有効なメモリアドレスへのポインタではありません。あなたがそれらの値を見ているということは、何かが間違っていることを示しており、それらを何らかの形で操作(読み書き)しようとすると悪い結果になります。この場合、無効なアドレスであるメモリアドレス0x12と0x1000に書き込みを試みているため、アクセス違反が発生しています。

どのようにTableViewCellオブジェクトを作成していますか? TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]をやっていますか?それが正しい方法です。

今、私は私の精神的なデバッガを起動するつもりです:私の推測あなたは、ポインタを使用してTableViewCellオブジェクトを宣言するために忘れていることである、(の存在に注意してくださいあなたの代わりにTableViewCell *myCellTableViewCell myCellとして、それを宣言している、すなわち、アスタリスク)。これにより、ヒープの代わりにスタック上にオブジェクトが作成され、その結果、データメンバに0ではなくガーベッジが作成されます。 Objective-Cオブジェクトは、適切に割り当てられると、allocへの呼び出しが成功した後で、すべてのデータメンバーが0に初期化されます(データタイプによってはNULL,nilまたはfalse)。

関連する問題