12

以前は、このようなプロパティと iVar の使用例を常に見てきました...

SomeClass.h の内部

@interface SomeClass : NSObject {
    NSString *_someString;
}

@property NSString *someString;

@end

次に SomeClass.m で

#import "SomeClass.h"

@implementation SomeClass

@synthesize someString = _someString;

@end

最近 (WWDC 2012 のビデオで) 、 iVar を関連付けずに を@synthesize使用することをお勧めします。@property

したがって、上記は次のように変更されます...

SomeClass.h

@interface SomeClass : NSObject

@property NSString *someString;

@end

SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@end

これは@propertyivar を使用していないだけです。これは理にかなっており、私はそれを使用しています。

しかし、私はまたの例を見てきました...

SomeClass.h

@interface SomeClass : NSObject

@end

SomeClass.m

#import "SomeClass.h"

@interface SomeClass () {
    NSString *someString;
}

@end

@implementation SomeClass

@end

これには、プライベートiVarといいえがあり@propertyます。

違いは何ですか?アクセサーメソッドも提供することは理解してい@propertyますが、アクセサーメソッドをオーバーライドする必要はありません。デフォルトのアクセサーをそのまま使用できます。

では、いつ ivar ではなく @property を使用し、いつ ivar のみを使用して を使用しないの@propertyでしょうか? そして、なぜ ivar を完全に取り除き、単に使用しないの@propertiesでしょうか? プライベートにする必要がある場合は、 .mのインターフェイス拡張内で使用してください。

メモリ管理に関する回答へのクイック編集。私は ARC を使用していますが、私にとっては、iVar を使用するよりも、使用strongした方がメモリ管理をより細かく制御できるように思えます。weak @properties

質問が十分に明確であることを願っています。

ありがとう

4

2 に答える 2

2

一般に、いつでもプロパティを使用できます。「割り当て」プロパティがある場合は、ゲッター/セッターでメモリ管理を必要としない ivar beause を使用できます。ただし、オブジェクトを保持する必要がある場合、ivar を使用するのは不便です。プロパティがそれを行う間、手動でオブジェクトを保持/解放する必要があるためです。

また、ivar を使用する場合は、値の設定/取得を制御できません。一般に、getter や setter の代わりにパブリック フィールドを使用することはお勧めできません。例えば、人の年齢を格納するフィールドに負の値を設定できてはいけません。

また、KVO を ivar で使用することはできません

于 2012-10-18T13:24:38.943 に答える
-1

->" "構文でパブリックivarにアクセスできるかどうかに依存すると思います。以前は、ivarを使用せずに読み取り専用プロパティを宣言すると、" "構文@privateを使用してivarにアクセスできます。->(多分それはカプセル化を破ります)。

しかし今、あなたがこのようなことを宣言すると

{
@private NSArray *a;
@protected NSArray *b;
@public NSArray *c;
}
@property (nonatomic, retain) NSArray *d; 

->「 」でのみ「c」ivarにアクセスできます。このコードを試してください。a、b、dを使用すると、警告またはエラーになります。

それがなんとか助けてくれれば嬉しいです。

于 2012-10-18T13:59:05.933 に答える