0

.h または .m ファイルで @property を宣言することの違いは何ですか

@property (nonatomic, readwrite, assign) BOOL notificationDidLaunch;

変数のスコープと関係がありますか?

また、.hファイルでは、次のようにブラケットを使用して文字列を宣言することの違いは何ですか

@interface AppDelegate : NSObject < UIApplicationDelegate > {
    NSString *hat;
}

以下のようにそれらの外でそれを行う

@property (nonatomic, strong) NSString *hat;
4

2 に答える 2

2

要約された説明

@property.mの内部はクラスにプライベートであり、.hの内部はパブリックです。

角かっこ内で宣言するか、角かっこなしで宣言するかの違いは、変数の意味です。

角かっこ内で、クラスのインスタンスによってのみアクセス可能であることを意図したインスタンス変数(またはivar)を宣言します。プロパティ(.hで宣言されている)は、すべてのクラスがアクセスできることを意味します。

プロパティ

基本的@propertyに、オーバーライドできるセットとgetを定義します。あなたがするとき:

AppDelegate myAppDelegate;
myAppDelegate.hat = @"A hat": 

あなたは本質的にやっています:

[myAppDelegate setHat:@"A hat"]

そして、あなたがするとき

myAppDelegate.hat //so you can get the property's value

あなたは本質的にやっています

[myAppDelegate hat]

セットと取得のオーバーライド

あなたがそうするとき、@synthesize hat = _hatあなたは本質的にインスタンス変数が_hat関連付けられているgetとsetを作成しています。このインスタンス変数は、gets / setsでのみアクセスする必要があり、クラス内でも、sets / getsを使用する必要があります(を使用してself.property

セットを@synthesizeオーバーライドして、次のメソッドをオーバーライドすることで作成できます。

- (void) setHat:(NSString*) aHat
- (NSString *) hat
于 2012-10-22T14:33:30.107 に答える
2

Tiago が言うように、@property 宣言を .m (実装) ファイルのクラス拡張内に配置することは、プロパティをプライベートにする方法であり、クラス自体のみがアクセスできるようにします。.h (パブリック インターフェイス ファイル) で宣言すると、その .h ファイルをインポートするすべてのコードに表示されます。@properties は実際には、アクセサー メソッドを宣言して合成するための便利なものであり、Objective-C のすべてのメソッドと同様に、完全にプライベートではないことに注意してください。最良の方法は、別のクラスで非パブリック メソッドを使用しようとすると、問題のメソッドを宣言するパブリック インターフェイスがないというコンパイラの警告です。

質問の 2 番目の部分では、これは myString というインスタンス変数 (「ivar」) を宣言します。

@interface MyClass : NSObject
{
    NSString *myString;
}

これは myString というプロパティを宣言していますが、次のようになります。

@property NSString *myString;

インスタンス変数と @property の違いは、クラスのインスタンスだけが ivar にアクセスできるというだけではありません。ivar を宣言すると、メモリ内のクラスの構造に変数が追加されます。対照的に、@propertiesはクラスのメソッドを宣言/定義します。デフォルトでは、これらのメソッドは関連付けられた同様の名前の ivar の値を設定/取得しますが、これは必須ではなく、ivar に直接アクセスしない @property のメソッドを持つことは完全に許容され、非常に一般的です。たとえば、firstName と lastName のプロパティを持つクラスとします_firstName_lastNameivar と、firstName および lastName getter メソッドによって返された値を単純に連結する (および/またはその set メソッドで 2 つの部分の名前を分割する) 3 番目の fullName プロパティを使用します。

于 2012-10-22T14:43:01.867 に答える