2

次のように、CTFontRef を保持するシングルトンを持つ標準の最新のシングルトン クラスを使用しています。

@interface MySingleton : NSObject {
    CTFontRef paintingFont;
}

@property (readonly) CTFontRef paintingFont;

@end


@implementation MySingleton

+ (MySingleton*)sharedInstance
{
    static dispatch_once_t once;
    static MySingleton *sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];

        //NB
        sharedInstance->paintingFont = 
           CTFontCreateWithName(CFSTR("Helvetica"), 80.0, nil);   
    });
   return sharedInstance;
}

@end

それから他の場所で私は電話します[[MySingleton sharedinstance] paintingFont]

ただし、この呼び出しは、次のようnilに前にアンダースコアを挿入するまで戻ります。paintingFont

        sharedInstance->_paintingFont = 
           CTFontCreateWithName(CFSTR("Helvetica"), 80.0, nil); 

どうしてこれなの?コンパイラはアンダースコアを含めるように要求するべきではありませんか? そうでない場合、以前のバージョンの目的は何ですか? そして、このアンダースコアはどこから来たのでしょうか? そもそもアンダースコアを使用してプロパティを宣言したことはありません。デバッガー ウィンドウの変数名にこれらの一見ランダムな挿入が表示されるだけです。

4

2 に答える 2

3

Xcode 4.4 以降、 を宣言する@propertyと、コンパイラは自動的に ivar と@synthesizeアクセサ メソッドを作成します。デフォルトの ivar はアンダースコア付きです。

構文を使用して->、プロパティではなく ivar に直接アクセスします。したがって、sharedInstanceメソッドで独自のivarを設定します(アンダースコアなし)。ただし、後でアクセスしようとすると[ ]、自動的に合成された getter メソッドを使用してプロパティ (およびアンダースコア付きで自動的に生成された ivar) にアクセスします。

プロパティにアクセスする.には、 の代わりに の表記を使用する必要があります。->または、自動生成された という ivar を使用するだけ_paintingFontです。

以下のコードを追加して、実装ファイルでプロパティを読み書き可能にすることもできます。これにより、実装でドット構文を使用してプロパティを設定できますが、他のクラスでは読み取り専用のままにできます。

@interface MySingleton ()
@property (readwrite) CTFontRef paintingFont;
@end

別の ivar が必要な場合は、 を使用@synthesizeしてオーバーライドできます。どちらの場合も、もう ivar を宣言する必要はありません。

@implementation MySingleton
@synthesize paintingFont;
....
@end
于 2012-09-27T23:52:31.627 に答える
2

これは、プロパティ paintingFont を宣言する際に、Obj C コンパイラがインスタンス変数 _paintingFont を作成するためです。

一般に、プロパティ/変数の設定は次のいずれかで行うことができます

  1. あなたのソリューションのようなインスタンスsharedInstance->_paintingFont = ...
  2. プロパティと を使用します。表記が異なりsharedInstance.paintingFont = ...ます。これにより、生成されたメソッド setPaintingFont が呼び出され、インスタンス変数に割り当てられます。

ただし、この場合、プロパティは読み取り専用であるため、方法 2 は使用できません。

于 2012-09-27T23:53:38.020 に答える