0

注:私はARCを使用していません

次のプロパティを持つUILabelがあります@property (nonatomic, retain) UILabel *someLabel;。カスタムセッターを設定しようとしています。@property次のコードは実際に呼び出しているので、リークを引き起こしretainますか?

- (void)setSomeLabel:(UILabel *)someLabel
{
    if (someLabel != self.someLabel) {
        [self.someLabel release];
        self.someLabel = [someLabel retain];
    }

    // some custom code here
}
4

4 に答える 4

8

注:私はARCを使用していません

あなたは本当に、本当にすべきです。


セッターは無限ループです。toの呼び出しself.someLabel = ...は、とまったく同じであり[self setSomeLabel:...]、ループが発生します。

正しい手動セッターは次のようになります。

- (void)setSomeLabel:(UILabel *)someLabel
{
  [someLabel retain];
  [_someLabel release];
  _someLabel = someLabel;

  // some custom code here
}

他の一般的なパターンがあります。主な問題は、オブジェクトが同じ値にリセットされた場合に「カスタムコード」を実行する必要があるかどうかです。そうでない場合は、このパターンの方が理にかなっています。

- (void)setSomeLabel:(UILabel *)someLabel
{
  if (someLabel != _someLabel) {
    [_someLabel release];
    _someLabel = [someLabel retain];

    // some custom code here
  }
}
于 2012-09-30T21:42:47.130 に答える
6

self.someLabelそのコードは、メソッドを呼び出す原因を使用すると、アプリを無限ループに導きますsetSomeLabel:

カスタムセッターに対して以下のコードを試すことができます。

 @synthesize someLabel = _someLabel;
 - (void)setSomeLabel:(UILabel *)someLabel
 {
      if (someLabel != _someLabel)
      {
           [_someLabel release];
           _someLabel = [someLabel retain];
      }

      // custom code
 }

 - (void)dealloc
 { 
     [_someLabel release];
     // ... other releases
     [super dealloc];
 }
于 2012-09-30T21:41:40.377 に答える
0

いいえ、ここでカスタムセッターを使用しているので、これはまったく問題ありません。

@Propertyは、アクセサメソッドを宣言するのと同じです。

@Synthesizeは、セッターやゲッターが実装されていない場合にのみ、プロパティ宣言属性に基づいてアクセサーメソッドを生成します。

于 2012-09-30T21:38:27.860 に答える
0

ARCを使用していないと思います...

渡されたsomeLabelを過剰に保持していることは正しいです。また、プロパティでreleaseを呼び出すことは適切ではありません。

プロパティの代わりにインスタンス変数を使用します。

- (void)setSomeLabel:(UILabel *)someLabel
{
    if (someLabel != _someLabel) {
        [_someLabel release];
        _someLabel = [someLabel retain];
    }

    // some custom code here
}
于 2012-09-30T21:39:59.903 に答える