重複の可能性:
Objective-C2.0のプロパティとインスタンス変数
最初のケースで@propertyと@synthesizeを使用し、@ propertyと@synthesizeを使用して同じインスタンス変数を宣言した場合の違いは何ですか?両方とも機能しているように見えるからです。
重複の可能性:
Objective-C2.0のプロパティとインスタンス変数
最初のケースで@propertyと@synthesizeを使用し、@ propertyと@synthesizeを使用して同じインスタンス変数を宣言した場合の違いは何ですか?両方とも機能しているように見えるからです。
違いはありません。宣言したインスタンス変数が使用され、その ARC プロパティは宣言された .xml によってオーバーライドされます@property
。
プロパティの指定された所有権はそのメタデータに保持されますが、それ以外の場合、プロパティが合成されない限り、意味は純粋に慣習的です。プロパティが合成される場合、関連付けられたインスタンス変数は、@synthesize 宣言によって暗黙的に名前が付けられたインスタンス変数です。関連付けられたインスタンス変数が既に存在する場合、その所有権の修飾はプロパティの所有権と等しくなければなりません。それ以外の場合、インスタンス変数はその所有権修飾で作成されます。
意図したプロパティのインスタンス変数を宣言すること@synthesize
は避けるのが最善です。別の名前のインスタンス変数が必要な場合は、合成構文を ivar 名で使用できます。
@synthesize myproperty = _myivar;
どちらも機能しますが、新しいアーキテクチャでは、プロパティを宣言する場合、iVar を明示的に宣言する必要はありません。これは自動的に行われるためです。
これは好みの問題ですが、両方を宣言する場合は、iVar に直接アクセスしているのか、getter と setter を経由しているのかを認識してください。
これは個人的な好みの問題ですが、ivar を明示的に宣言しないことをお勧めします。ここSOで、人々が次のようなことをした状況を見てきました。
@interface MyClass
{
NSString *var;
}
@property (nonatomic, strong) NSString *var;
@end
その後
@implementation MyClass
@synthesize var = _var;
したがって、ユーザーはプロパティと同じ名前の ivar の両方を明示的に宣言しましたが、別の ivar (この例では、名前に前のアンダースコアが付いたもの) を生成するプロパティを合成し、2 つの ivar が生成されました。次に、明示的に宣言された ivar がなぜ機能しないのか疑問に思います。@synthesize
ivar を明示的に宣言しない場合、ivar の明示的な宣言またはステートメントで名前を誤って入力したために、誤って 2 つの ivar になってしまうという問題はありません。
プロパティのみを宣言し、次に別の名前を使用して ivar を宣言するだけです (通常、前にアンダースコアを付けます)。あいまいさはありません (つまり、プロパティを として適切@synthesize
に参照するのを忘れた場合に、誤って ivar を参照する可能性が低くなります)。心配、例えば:var
self.var
@interface MyClass
@property (nonatomic, strong) NSString *var;
@end
その後
@implementation MyClass
@synthesize var = _var;