9

私はObjective Cに非常に慣れていません(今から2日です)。について読んだとき@synthesize、それは私の理解 (私が理解していると思っていた) と重なっているように見えました@property... それで、いくつかの詳細を頭の中で解決する必要があります ... それは私を悩ませています.

@propertyとの違いについて間違っている場合は、修正してください@synthesize

でa を宣言する@propertyと、@interfaceユーザーはそのプロパティに対して標準の getter と setter を使用することを期待できることを世界に伝えることになります。さらに、XCode は一般的なゲッターとセッターを作成します。...しかし、 @property 宣言で どの程度発生しますか? (IEは「完全に」という意味ですか...あなたの目に見えない宣言や、あなたの@interface目に見えないコードのように@interface

-または-

あなたの唯一@propertyの目に見えないコード宣言を処理しますが、あなたのセクションで目に見えないコードの実装を処理しますか? )@interface@synthesize@implementation

4

3 に答える 3

17

まず、最新バージョンのXcodeでは@synthesizeがまったく必要ないことに注意してください。省略できます(そして省略すべきです)。そうは言っても、これが作品の役割です。

@propertyアクセサーの宣言です。それは単なる宣言です。次の間にほとんど違いはありません。

@property (nonatomic, readwrite, strong) NSString *something;

対。

- (NSString *)something;
- (void)setSomething:(NSString)aSomething;

主な違いは、を使用してこれらのメソッドを宣言@propertyすると、コンパイラが実装を自動的に生成(合成)できることです。コンパイラに任せる必要はありません。あなたは完全に自由にsomethingそしてsetSomething:手で実装することができます、そしてそれは一般的です。ただし、手動で実装しない場合、コンパイラは呼び出されたivarを自動的に作成_somethingし、getterとsetterの適切な実装を作成します。

Xcodeの古いバージョンでは、@synthesizeキーワードを使用して自動生成を明示的に要求する必要がありました。しかし、それはもはや必要ありません。今日、使用する唯一の理由@synthesizeは、ivarに非標準の名前を付けたい場合です(決してそうしないでください)。

ここで重要な点は、メソッドsomethingsetSomething:単なるメソッドであるということです。それらには魔法のようなものは何もありません。それらは特別な「プロパティメソッド」ではありません。これらは、慣例により状態の一部にアクセスするための単なるメソッドです。その状態の一部は多くの場合ivarに保存されますが、そうである必要はありません。

さらに明確にするために: 「から名前が付けられたivarを返す」という意味でobject.somethingはありませ。それは「それが何をするにしても、の結果を返す」という意味です。ivarの値を返すのが一般的です。_somethingobject[object something]

宣言を使用してすべての状態(内部および外部)を@property宣言する必要があります。また、ivarを直接宣言することは避けてください。また、メソッドとメソッドself.somethingを除いて、常にアクセサ()を介してプロパティにアクセスする必要があります。およびでは、ivar()を直接使用する必要があります。initdeallocinitdealloc_something

于 2012-10-04T15:19:25.940 に答える
7

@property提供する原子性とセッターのセマンティクスを使用して、クラスのプロパティを宣言します。

Xcode 4.4 では、自動合成が利用可能で、プロパティからバッキング ivar を で宣言せずに提供されます@synthesize。この ivar は_propertyNamewhere your property name isの形をしていますpropertyName

于 2012-10-04T15:12:08.310 に答える