3

@propertyと@synthesiseのポイントは何だろうと思っていました。現時点では、以下を使用して何かを宣言しています。

//Class.m
#import "Class.h"

CCNode *node;

@implementation
//init, etc..

しかし、私は他の人が使用するのを見ました:

@property (nonatomic, etc..) CCNode* node;
@synthesise (nonatomic, etc..) node;
//I am not too sure on how this type of declaration works, please correct me on how it's done.

どちらも同じように機能しているようですが、@ propertyと@synthesiseの方法の利点は何ですか?彼らは異なることをしますか?もしそうなら、何ですか?

4

5 に答える 5

5

@property-ゲッターとセッターの宣言を作成します。

@synthesize-プロパティ内で渡されるパラメーターに基づいて、getterとsetterの定義を提供します。

これをチェックしてください、そこに同じ存在についてもっと多くの詳細があります-https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

于 2012-05-29T12:19:54.093 に答える
5

@propertyおよび@synthesizeは2つのObjectiveCキーワードであり、プロパティを簡単に作成できるため、プロパティのゲッターメソッドとセッターメソッドを手動で作成する必要がありません。

プロパティ自体を定義し、@propertyヘッダーファイルに配置する必要があり、いくつかの属性を取得できます(たとえば、strong、nonatomic、retainassign、copy)。@synthesize実装ファイルに配置し、コンパイラに次の本体を生成するように指示する必要があります。 getterおよびsetterメソッド。

これらの2つのキーワードは、プロパティコードの生成を処理し、何よりもプロパティのメモリ管理を処理するため、属性を適切に使用する場合に非常に役立ちます。

于 2012-05-29T12:47:30.420 に答える
2

コンパイラを使用@propertyすると、読み取り専用および読み取り/書き込みに基づいてgetterメソッドとsetterメソッドの宣言が処理されます。

readonly -> getterMethod

readwrite ->コンパイラの使用に関するsetterメソッドとgetterメソッドの両方が、メソッド@synthesizeの定義gettersetterメソッドを処理します

于 2012-12-11T16:46:56.630 に答える
0

クラスにインスタンス変数(ivar)がある場合、通常、他のクラスからインスタンス変数にアクセスすることはできません。したがって、パブリックアクセサメソッド(ゲッターとセッター)を作成する必要があります。彼らはこのように見えます:

セッター:

- (void)setMyVariable:(SomeClass *)newValue {
    if (newValue != myVariable) {
        [myVariable release];
        myVariable = [newValue retain];
    }
}

ゲッター:

- (SomeClass *)myVariable {
    return myVariable;
}

これは、Objective-C2.0より前に行う必要があった方法でした。これで、@propertyと@synthesizeを使用してこれを高速化できます。基本的には単なるショートカットです。

ヘッダーでは、@ propertyを使用して、必要なセッターの種類を定義します。セッターは渡された値を保持する必要がありますか(私の例のように)、コピーするか、単に割り当てる必要がありますか?

そして、実装では、@ synthesizeを記述するだけで、コンパイラーがその位置に自動的に作成されたゲッターとセッターを含めるようになります。通常、実装の最上位にあります。

于 2012-05-29T12:24:51.110 に答える
0

私の考えでは、すべてのiVarにはアンダースコア合成プロパティが関連付けられている必要があり(_iVarを使用すると、偶発的な直接アクセスを防ぐことができます)、initおよびdeallocメソッドを除くiVarへのすべてのアクセスはプロパティを介して行う必要があります。

私見の大きな利点はメモリ管理です。どのiVarが保持されているかを覚えておく必要がないため、より安全ではるかに簡単です。

そして、アクセサーをコーディングするのにどれだけの作業が必要かを考えてください。ゲッターの場合は4行、セッターの場合は2行です。

将来のある時点で@synthesizeオプションになる可能性が高いため、必要なのは@property

于 2012-05-29T12:32:01.327 に答える