7

編集: この質問は、(クラス プロパティだけでなく) 通常の宣言されたプロパティにも適用されます。

元の投稿:

sharedInstance現在 getter メソッドとして実装されているパブリック クラス メソッドがあるとします。

@interface MyClass

+ (instancetype)sharedInstance;

- (void)doSomething;

@end

@implementation MyClass

+ (instancetype)sharedInstance {
    static MyClass *shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[MyClass alloc] init];
    });
    return shared;
}

@end

Swift 3.0 でこのメソッドにアクセスすると、次のようになります。MyClass.shared().doSomething()

したがって、より迅速に行うには、クラス メソッドをクラス プロパティに変更する必要があります (Xcode 8 の新機能ですが、実際には Apple Docu で見つけることができず、WWDC 2016 ビデオでのみ見つけることができます)。

@interface MyClass

@property (class, nonatomic, readonly) MyClass *sharedInstance;

- (void)doSomething;

@end

// implementation stays the same

今Swiftコードで:MyClass.shared.doSomething()

ではnonatomic/atomic、プロパティ修飾子 (正確な用語はわかりません) は、objc で自分自身を実装する getter メソッドに対しても意味がありますか?

4

2 に答える 2

5

atomic/修飾子は、nonatomic複数の理由から、あなたの場合には効果がありません。

主な理由は、原子性キーワードが生成されたコード (つまり、合成されたアクセサー メソッド) のみに影響するためです。インターフェイスでa を宣言し、@property実装でメソッド (またはメソッド ペア) を使用してそれを実装すると、コンパイラはコードを生成しないため、atomicity キーワードは無視されます。

この状況に到達するにはいくつかの方法があり、そのうちのいくつかをトリガーしています。

  • まず、classプロパティがあります。コンパイラは、クラス プロパティのアクセサーまたはストレージを合成できません。つまり、コードが生成されないため、アトミック性は適用されません。

  • readonly第 2 に、プロパティの最も一般的な使用法では、@property宣言は手動で実装された getter メソッドによってサポートされます。これは、コード生成がないため、原子性が適用されないことを意味します。

    (インスタンス プロパティをreadonlyパブリック インターフェイスとして宣言し、実装でのプライベート再宣言のために合成することもできreadwriteます。その場合、アトミック性が適用されるだけでなく、パブリック宣言とプライベート宣言の間でアトミック性キーワードを一致させる必要があります。ゲッターのみを合成し、実装でバッキング ivar を直接操作することもできます。)

atomicこのプロパティにorを指定nonatomicしてもどちらの方法にも影響しないため、原子性キーワードを宣言から完全に除外することは自由です。(コンパイラは を想定atomicしますが、前述のように、その想定は効果がありません。)

于 2016-11-07T18:59:13.253 に答える