1

Singletonアプリケーション全体でそのインスタンスを使用したい定数クラスがあるとします。

ではsomeClass、したがって、参照できます[Constants instance] someCleverConstant];

これを入力するとすぐに古くなるので、インスタンスへのショートカットを取得すると便利です。

  • ではsomeClass、宣言できます@property (nonatomic, weak, readonly) Constants *constants;
  • そしてインスタンスへのゲッター
-(Constants*) constants {
  if (constants == nil) 
    constants = [Constants instance];
  return constants;
}

このようにsomeClassで、したがってconstants.someCleverConstant;代わりに参照できます

これに関するいくつかの質問:

  • 私が説明したことは合理的なアプローチですか?
  • プロパティを宣言するのは正しいweakですか?
  • 私が説明した内容にパフォーマンス上の懸念はありますか? 実際にインスタンスを直接呼び出す方が良いでしょうか?
  • 20 個のクラスがあり、それぞれが定数インスタンスへの独自のポインターを必要とする状況を考えてみましょう。その場合、このアプローチは機能しますか?

お時間をいただきありがとうございます。

4

4 に答える 4

3

@vinceburn に続いて、定数には次の例を使用し、より複雑な構造にはシングルトンを使用します。

// Constants.h
// Replace PSMyApp for something more useful. e.g. company/name initials followed by app/class

// String example
NSString * const PSMyAppString = @"constantString"; 

// Logically related integers
typedef enum {
   PSMyAppRelatedValuesOne = 0,
   PSMyAppRelatedValuesTwo,
   PSMyAppRelatedValuesThree
} PSMyAppRelatedValues;

// Float example
const CGFloat PSMyAppFloat = 0.3f;

// Integer that has no related values
const NSInteger PSMyAppInteger = 2;

#define私はオートコンプリートとコンパイラチェックを取得し、Appleが一部のUIKitクラスで行う方法により自然に適合するため、これよりも好きです.

于 2011-12-14T00:43:04.783 に答える
2

これは、グローバル変数または関数を使用するだけで回避するのは大変な作業のようです。どちらかがより合理的なアプローチだと思います。

于 2011-12-14T00:21:59.747 に答える
1

定数については、このような .h ファイルを使用することを好みます

// ConstanteDef.h
#pragma mark Entity Name Constante
#define kItemInfos @"ItemInfos"
#define kCategorie_DItems @"Categorie_DItems"
#define kCommerce @"Commerce"
#define kListe @"Liste"
#define kListeItem @"ListeItem"
#define kPrixElement @"PrixElement"
#define kTypeDe_CommerceOuListe @"TypeDe_CommerceOuListe"

シングルトンを使用して、より複雑な要素を返します。
これは、どこでも同じコードを書き直すのではなく、コア データを使用してライブを簡素化するために作成したシングルトンです。

@interface CoreDataController : NSObject {

NSManagedObjectContext *leManagedObjectContext;
NSManagedObjectModel *leManagedObjectModel;

@private
Commerce_MO *leCommerceAucun;
}
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;

#pragma mark Objet par Défaut
@property (nonatomic, retain, readonly) Commerce_MO *commerceAucun;

#pragma mark Nouvel Objet
//  new = retain count = 1, celui qui commande est responsable de la mémoire.
- (id)newMOforClass:(Class)uneClasse;   //  Pas le mieux, mais pourrais servir pendant le run time.  Retourne nil si uneClasse ne correspond pas à quelque chose.
- (PrixElement_MO *)newPrixElement;
- (ItemInfos_MO *)newItemInfos;
- (Commerce_MO *)newCommerce;
- (Liste_MO *)newListe;
- (ListeItem_MO *)newListeItem;

#pragma mark Singleton call
+ (CoreDataController *)sharedCoreDataController;
@end

したがって、私のコードでは、新しいエンティティを作成する必要があるときは、これを行うだけです:

CoreDataController *cdc = [CoreDataController sharedCoreDataController];
Liste_MO * = [cdc newListe];

シングルトンの概念の詳細については、Apple のドキュメントのセクションを参照してください。また、シングルトンを作成するために提供されているコードを詳しく調べてください。シングルトンへのリンクCreating a Singleton Instanceに関する質問に答える必要があります。 しかし、厳密なシングルトン実装では、アプリケーションの全期間にわたって、そのクラスのインスタンスが 1 つだけ作成されます。したがって、それを指す100個のオブジェクトを取得してもメモリフットプリントは変わらず、シングルトンは1つしかありませんが、それらの100個のオブジェクトがあれば、メモリに確実に影響を与えます.weak or strong

于 2011-12-14T00:35:37.640 に答える
1

NSAppforのように、シングルトンへのグローバル ポインターを作成するだけです[NSApplication sharedApplication]

おそらく、あなたはすでに次のようなものを持っています

static Constants * defaultInstance = nil;

実装ファイルの先頭にあります。を削除してstatic、ヘッダーで変数を宣言すると (定義は .m ファイルに保持されます):

@interface Constants : NSObject
// etc.
@end

extern Constants * defaultInstance;

その後、ヘッダーをインポートする任意のファイルで名前を介してシングルトンインスタンスにアクセスできますdefaultInstance(おそらくその名前を変更したいでしょう) (とにかくこれを行う必要があります)。使用する前にポインターが設定されていることを確認する+instanceなど、プログラムの非常に早い段階でシングルトンセットアップメソッド(またはその他)を呼び出す必要があります。-applicationDidFinishLaunching

  • 私が説明したことは合理的なアプローチですか?

上記およびPaul.sの回答に記載されている、他のより良いアプローチがあると思います。

  • プロパティを宣言するのは正しいweakですか?

はい、シングルトンがそれ自体を所有しているため、このポインターを持つクラスはそれを所有する必要はありません。

  • 私が説明した内容にパフォーマンス上の懸念はありますか? 実際にインスタンスを直接呼び出す方が良いでしょうか?

いずれにせよ、[Constants instance]またはself.constantsメッセージ送信を行っています。初めて行う場合はself.constants、2 つを行っています。ただし、これは本当の懸念事項ではありません。

  • Constants20 個のクラスがあり、それぞれがインスタンスへの独自のポインターを必要とする状況を考えてみましょう。その場合、このアプローチは機能しますか?

私には、扱いにくく、エレガントではないように思えます。

于 2011-12-14T01:06:07.633 に答える