私はiOS(cs193p)でスタンフォードiTunes Uコースを見てきました.@synthesize
@synthesize name = _name;
しかし、宣言されたプロパティに関する Cocoa のドキュメントを閲覧している間、私はこれを実際に見たり、他のサンプル コードで見たりしませんでした。
なぜこれが必要なのですか?@synthesize
プロパティ名で を使用するだけで十分ではありませんか? これにより回避できる特定の問題はありますか?
私はiOS(cs193p)でスタンフォードiTunes Uコースを見てきました.@synthesize
@synthesize name = _name;
しかし、宣言されたプロパティに関する Cocoa のドキュメントを閲覧している間、私はこれを実際に見たり、他のサンプル コードで見たりしませんでした。
なぜこれが必要なのですか?@synthesize
プロパティ名で を使用するだけで十分ではありませんか? これにより回避できる特定の問題はありますか?
そうする理由は、 ivar が直接アクセスされてメモリ管理の問題が発生するのを防ぐためです。例えば:
正しい: self.name = newName;
正しくない:name = newName;
プロパティのゲッターとセッターは、メモリ管理が正しく処理されることを保証します。ivar にアクセスするには、先頭のアンダースコアを明示的に入力する必要がありますが、これは偶然に行うのは非常に困難です。ivar に直接アクセスできるのは、init
、dealloc
および getter と setter だけです。
ivar 名を指定しない場合、プロパティと同じ名前が使用されます。したがって、これら2つは同等です。
@synthesize name;
@synthesize name = name;
あなたがしていることがすべてである場合name = name
、はい、それは完全に冗長です。
人々がそのようなものを指定する理由name = _name
は、ivar とプロパティに別の名前を使用するためです。これを行う理由の 1 つは、プロパティと ivar を混同しないようにするためですが、率直に言って、違いが明確でない場合、この小さな調整は役に立ちません。
@synthesize name = _name;
とは別の意味を持つため、冗長ではありません@synthesize name;
。ivar にプロパティとは異なる名前を付けたいかどうかは、主に個人的な好みの問題です。両方のバリアントは完全に問題ありません。