3

AppStoreからPaulHegartyのチュートリアルを聞いたり見たりしています。彼のレッスンでは、常に次のように実装ファイルのプロパティを合成する必要があると述べています。

@sysnthesize example = _example;

また、プロパティを合成しないアップルのドキュメントチュートリアルも行っています。また、次のようなinitメソッドもあります。

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if (self)
    {
        _name = name;

        _location = location;

        _date = date;

        return self;
    }

    return nil;
}

@end

これらを次のように追加すると、これらは相互作用したり、キャンセルしたり、その他の方法で相互に混乱したりしますか?

@implementation BirdSighting

@synthesize name = _name;

@synthesize location = _location;

@synthesize date = _date;

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if (self)
    {
        _name = name;

        _location = location;

        _date = date;

        return self;
    }

    return nil;
}

@end

助けてくれてありがとう。

4

1 に答える 1

4

「これらが相互作用するか」という観点から考えることは、おそらく正しいメンタルモデルではありません。開始する場所は、これらの各行が何をするかを理解することです。それでは、各例から1つ考えてみましょう。

@synthesize name = _name;

nameというプロパティ(@property、通常は.h内)が存在する場合、これはいくつかのことを行います。

  1. -setName:と-nameという2つのメソッドを作成し、インスタンス変数_nameを設定および取得します。
  2. _nameというインスタンス変数が存在しない場合は、インスタンス変数が作成されます

今、他の例:

_name = name;

これは1つのことを行います。'name'のアドレスをインスタンス変数_nameに割り当てます。

それらが何をするかを理解したので、それらがどのように相互作用するかを考えてみましょう。

  1. 割り当てる_nameという明示的なインスタンス変数がない場合、2行目はコンパイルされません。最初の行は、その名前のインスタンス変数があることを確認する1つの方法です
  2. nameプロパティを設定した場合(ドット表記または-setNameメソッドのいずれかを使用しても、違いはありません)、@ synthesizeステートメントによって作成されたメソッドを使用して、同じ_nameインスタンス変数を変更します。
  3. コードで_nameを使用する場合、またはドット表記または-nameメソッドを使用する場合は、これらの方法のいずれかによって最後に割り当てられた値が使用されます。
  4. self.name=nameではなく_name=nameを実行します。-setName:メソッドは呼び出されません。つまり、set以外の処理(たとえば、引数の保持)は行われません。

追加の考慮事項:Xcodeのごく最近のバージョンでは、@ synthesizeステートメントを省略した場合、コンパイラーは自動的に@synthesizeステートメントを挿入します。これは良いことです(入力が少なく、冗長性が少なく、間違いが少ない)が、予期しない場合は混乱する可能性があります。たとえば、上記の私のポイント1は、新しいバージョンには適用されません。

于 2012-12-15T03:25:47.887 に答える