次のコードを確認しました。
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
関係は何であるmapView
とはmapView1
?それはset
とget
メソッドを作成しmapView1
ますか?
次のコードを確認しました。
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
関係は何であるmapView
とはmapView1
?それはset
とget
メソッドを作成しmapView1
ますか?
回答:
あなたの例では、mapView1
あるインスタンス変数(IVAR)で定義されたクラスのインスタンスに属するメモリストレージの部分example.h
とexample.m
。プロパティmapView
の名前です。プロパティは、ドット表記を使用して読み取りまたは設定できるオブジェクトの属性です。プロパティはivarに基づく必要はありませんが、ほとんどのプロパティはそれに基づいています。宣言は、単にと呼ばれるプロパティがあることを世界に伝えます。myObject.mapView
@property
mapView
@synthesize mapView = mapView1;
この行は、にsetterとgetterを作成するようコンパイラーに指示しmapView
、と呼ばれるivarを使用するように指示しますmapView1
。この= mapView1
部分がないと、コンパイラーは、プロパティーとivarが同じ名前であると想定します。(この場合、と呼ばれるivarがないため、コンパイラエラーが発生しますmapView
。)
この@synthesize
ステートメントの結果は、このコードを自分で追加した場合と同様です。
-(MKMapView *)mapView
{
return mapView1;
}
-(void)setMapView:(MKMapView *)newMapView
{
if (newMapView != mapView1)
{
[mapView1 release];
mapView1 = [newMapView retain];
}
}
そのコードを自分でクラスに追加した場合、@synthesize
ステートメントを次のように置き換えることができます。
@dynamic mapView;
主なことは、ivarとプロパティの概念を明確に区別することです。それらは実際には2つの非常に異なる概念です。
レガシーコードを編集するときにこの問題に遭遇したので、知っておく必要がある既存の回答に追加のメモを作りたいと思います。
新しいコンパイラバージョンでも、省略した@synthesize propertyName
かどうかによって違いが生じる場合があります。
次のように、インスタンス変数を合成しながら、アンダースコアなしでインスタンス変数を宣言する場合:
ヘッダ:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
実装:
@implementation SomeClass
@synthesize someInt;
@end
self.someInt
と同じ変数にアクセスしますsomeInt
。ivarsの先頭のアンダースコアを使用しないと、命名規則に従いませんが、そのようなコードを読んで変更しなければならない状況になりました。
しかし、「ねえ、@ synthesizeはもう新しいコンパイラを使用しているので、もう重要ではない」と思ったら、間違いです!次に、クラスは2つのivar、つまりsomeInt
、自動生成された_someInt
変数を持つことになります。このようにself.someInt
してsomeInt
、それ以上同じ変数に対処しません。私のようにそのような行動を期待していない場合、これはあなたにいくつかの頭痛を見つけるかもしれません。
@synchronize
プロパティにアクセスするときにスレッドを同期する方法のディレクティブであり、@synthesize
ゲッターとセッターを介してプロパティをインスタンス変数にバインドするためのものです。
Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
。(私はこの警告が追加されたxcodeのバージョンを知りません。)
アップルのドキュメントのとおり、@ Synthesizeはインスタンス変数の名前を変更するためにのみ使用されます。例えば
@property NSString *str;
@synthesize str = str2;
さて_str
、上記の行はインスタンス変数の名前をstr2
@property
オブジェクトを他のクラスのオブジェクトで使用できるようにします。つまり、オブジェクトをパブリックにします。
@interfaceでプロパティを作成すると、そのプロパティは_propertyNameという名前のインスタンス変数によって自動的に戻されます。そのため、firstNameという名前のプロパティを作成すると、舞台裏コンパイラはデフォルトで_firstNameという名前のインスタンス変数を作成します。コンパイラーは、あなたのためにゲッターとセッターのメソッドも作成します(つまり、firstName、setFirstName)。
これで、プロパティを@synthesize firstNameで合成するとき、コンパイラーにインスタンス変数(_firstName)の名前をfirstNameに変更するように指示するだけです。バックアップされたインスタンス変数の名前を別の名前に変更する場合は、プロパティ名を合成するときに別の名前を割り当てるだけです(つまり、@ synthesize firstName = myFirstName)。これを行うと、myFirstnameという名前のインスタンス変数によってプロパティがバックアップされます。
つまり、要するに、ほとんどの場合、@ synthesizeは、プロパティによってバックアップされたインスタンス変数の名前を変更するために使用されていました。
基本的に、合成は、mapView1を設定および取得するsetMapViewおよびmapViewメソッドを作成します。