3

私はint財産 を持っています

@property(nonatomic) int stackTop;

合成されたときのデフォルト値は 0 です。このデフォルト値を -1 に設定したいと思います。

このようにsetterメソッドをオーバーライドしてみました

@sythesize stackTop = _stackTop;

-(void)setStackTop:(int)stackTop
{
    _stackTop = -1;
}

初期値は0ではなく-1ですstackTopが、プログラムで変数が変更されても変更されません。たとえば、私は持っていますがself.stackTop++;、インクリメントされていません。オーバーライドされていない setter メソッドでは、そのステートメントは値を変更します。私は何を間違っていますか?解決策は何ですか?

4

4 に答える 4

6

指定された初期化子で -1 に設定します。

編集:
あなたの質問に応えて、指定された初期化子はクラスインスタンスの作成時に常に呼び出す必要がある1つの初期化子です。が呼び出される唯一の場所で[super init];あり (親クラスから継承したクラスの一部を初期化します)、他のすべての初期化子は、クラスが適切にセットアップされ、すべてのデフォルト値が正しく設定されていることを確認するために、この指定された初期化子を呼び出す必要があります。設定したいものも含めて設定します。

あなたの場合、で始まる他のメソッドがない場合は、メソッドでinitそれを行う必要があります-(id)init。私が回答を投稿してから他の人が示したように、次のようになります。

-(id)init {
    if (self = [super init]) {
        _stackTop = -1;
    }
    return self;
}
于 2012-06-22T14:29:55.493 に答える
2

init メソッドで設定します。

例えば

-(id)init
{
 self = [super init];
 if(self)
 {
   _stackTop = -1;
 }
 return self;
}
于 2012-06-22T14:30:17.457 に答える
2

指定された初期化子で設定する必要があります。たとえば、指定された初期化子がパラメーターなしの場合、次のようにすることができます。

-(id)init {
    if (self = [super init]) {
        _stackTop = -1;
    }
    return self;
}
于 2012-06-22T14:31:06.023 に答える
1

作成した (または使用している) クラスの init メソッドに、次の行を追加します。

self.stackTop = -1;

これにより、オブジェクトの作成時にプロパティが初期化されます。

次に、カスタム セッター メソッドを取り除くことができます。

于 2012-06-22T14:30:25.617 に答える