2

[self setVariable:value];Objective Cでは、代わりにどのシナリオを使用しますかvariable = value;

セルフセットを実行することで、数行のコードを節約できるように見えますが、他にどのような利点がありますか?さらに、いつセルフセットをしたくないですか?

4

3 に答える 3

3

編集:私が以下で参照しているのは、厳密にプロパティである変数に関するものであることを明確にする必要があります。self.variable = value変数が単なる ivar である場合、またはの間に違いはありませんが、それが単なる ivar である場合はコンパイルさえしないvariable = valueという事実を除いてself.variable = value、その場合は使用する必要がありますself->variable = value

通話中

[self setVariable:value];

呼び出しと同じです

self.variable = value;

ただし、これは次と同じではありません

variable = value;

最初の 2 つのケースでは、合成setVariableされたメソッド (または独自に定義したメソッド) を使用します。これを使用する理由は、オブジェクトの保持カウントを適切に保つためです。

たとえば、次のような単純なプロパティ:

@property (retain) NSString *myString;

次のような自動生成された set 関数を取得します。

-(void) setMyString:(NSString*)other
{
    myString = [other retain];
}

電話するだけなら

myString = otherString;

コードの他の場所でmyString適切に保持されないため、otherString割り当てが解除されると、そのオブジェクトへのポインターは無効になります。

于 2012-07-02T15:30:46.850 に答える
1

変数に値を割り当てるよりもセッターを使用する主な理由は、カプセル化を実現することです。

いくつかの利点は -

  1. プロパティの取得または設定によるカプセル化により、追加機能 (検証など) を後で簡単に追加できます。
  2. インスタンス変数を非表示にします。
  3. 効果的なメモリ管理。
于 2012-07-02T15:28:51.013 に答える
0

Objective-C メモリ管理モデルに準拠するために保持と解放が必要なオブジェクトを保持する場合は、必ずこれを使用する必要があります。例えば:

MyObject.h:

@interface MyObject : NSObject
{
    NSString *_name;
}
@property (retain, nonatomic, readwrite) NSString *name;

@end

MyObject.m:

@implementation MyObject

@synthesize name = _name;

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        self.name = [NSString stringWithFormat:@"name:%d", 12];
    }
    return self;
}

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

@end

int、 などのfloatメモリ管理を必要としないデータ型の場合、setter/getter メソッドを使用せずに済む場合がありますが、常にそれらを使用することをお勧めします。

于 2012-07-02T15:28:39.250 に答える