[self setVariable:value];
Objective Cでは、代わりにどのシナリオを使用しますかvariable = value;
セルフセットを実行することで、数行のコードを節約できるように見えますが、他にどのような利点がありますか?さらに、いつセルフセットをしたくないですか?
[self setVariable:value];
Objective Cでは、代わりにどのシナリオを使用しますかvariable = value;
セルフセットを実行することで、数行のコードを節約できるように見えますが、他にどのような利点がありますか?さらに、いつセルフセットをしたくないですか?
編集:私が以下で参照しているのは、厳密にプロパティである変数に関するものであることを明確にする必要があります。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
割り当てが解除されると、そのオブジェクトへのポインターは無効になります。
変数に値を割り当てるよりもセッターを使用する主な理由は、カプセル化を実現することです。
いくつかの利点は -
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 メソッドを使用せずに済む場合がありますが、常にそれらを使用することをお勧めします。