19

プロパティの標準合成セッターをオーバーライドしようとしました。これまでのところ、すべて問題ありません。ivar を新しい値に設定しただけです。しかし、「保持されたプロパティの保持カウントで何が起こるか」と自問しました...これを説明する良い答えが見つかりませんでした。そこでここで質問します。設定されているプロパティ セッターをオーバーライドする場合に注意しなければならretainないことはありますか?どうすれば正しく行うことができますか? ARCは使いません。

次に例を示します。

@property(nonatomic)NSInteger number;

- (void)setNumber:(NSInteger)number {
    _number = number;  // This should be fine, since it's no retained object I want to set
}


@property(nonatomic, retain)NSObject *something;

- (void)setSomething:(NSObject *)something {
    _something = something;  // This is not fine. As far as I know you should never do sth. like this... But how do I set it correctly?
}
4

4 に答える 4

29
-(void) setAnObject:(NSObject*) someObject {
    if (_anObject != someObject) {
       NSObject* savedObject = _anObject;
       _anObject = [someObject retain];
       [savedObject release];
    }
}

新しいポインターを保持する前に古いポインターを解放すると、古いオブジェクトの値から値を設定している状況が発生する可能性があり、古いオブジェクトを解放すると、新しいオブジェクトが POOF になります。保留直前。

または、次のことができます

....
[someObject retain];
[_anObject release];
_anObject = someObject;
...
于 2012-09-11T12:46:34.593 に答える
5

別の名前にするためだけにセッターを上書きしていますか?その場合は、プロパティ定義を変更することでこれを行うことができます。

@property(nonatomic, setter = nameOfSetter: )NSInteger number;

ゲッターでも同じように動作します。

于 2012-09-11T12:38:08.350 に答える
5

HotLicksから受け入れられた回答を研究した後に編集

xのプロパティ宣言と合成

@property (nonatomic, retain) ClassX x;
@synthesize x = _x;

xのオーバーライドされたセッター

- (void)setX:(ClassX *)x;
{
  if (x != _x)
  {
    [x retain];
    [_x release];
    _x = x;
    // custom code here
  }
}
于 2012-09-11T12:39:26.897 に答える
4
- (void) setSomething:(NSObject*) something
{
    if (something != _something)
    {
        [_something release];
        _something = [something retain];
    }
}

ifステートメントが必要なのは、そうでない場合、何かと_somethingがすでに同じである場合、オブジェクトを過剰リリースし、オブジェクトが消えてしまう可能性があり、問題が発生するためです。

于 2012-09-11T12:39:52.217 に答える