1

リモートオブジェクトをローカルオブジェクトに自動的にマッピングするRestkitというiOSライブラリを使用しています。これを行うには、KVCパターンを使用してマッピングを作成し、そのマッピングをロードします。

それがどのように機能するかは理解していますが、一部の部分が特定の方法で実装されている理由がわかりません。たとえば、次のようにRKObjectMappingのインスタンスを作成するシングルトンパターンを使用します。

RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:[Article class]];
[articleMapping mapKeyPath:@"title" toAttribute:@"title"];
[articleMapping mapKeyPath:@"body" toAttribute:@"body"];
[articleMapping mapKeyPath:@"author" toAttribute:@"author"];
[articleMapping mapKeyPath:@"publication_date" toAttribute:@"publicationDate"];

ただし、実際に使用する場合は、次のように、クラスRKObjectManagerのsharedManagerを呼び出してマネージャーにアクセスします。

[[RKObjectManager sharedManager].mappingProvider setMapping:articleMapping
                                                 forKeyPath:@"articles"];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/articles"
                                                  delegate:self];

私が理解していないのは、sharedManagerのようなクラスメソッド/変数を使用してクラスにアクセスするだけなのに、なぜクラスをarticleMappingとしてインスタンス化するのが面倒ということです。次のようなことをしてみませんか。

[RKObjectMapping initWithClass:[Article class]];

私は初心者なので、私が気付いていないこのパターンをとるのには十分な理由があると思います。なぜこれがこのように実装されるのかを知っているか理解している人はいますか?

4

2 に答える 2

1

シングルトンパターンは、グローバルオブジェクトを「整然とした」方法で管理し、その種類の1つだけがシステムに存在することを保証する方法と考えてください。

したがって、シングルトンは、グローバルで一意のオブジェクトにアクセスするための単なる方法であり、最初のアクセス試行でインスタンス化されます。

このグローバルで一意のオブジェクトにアクセスすると、システム内の他のオブジェクトとまったく同じように動作します。つまり、独自の状態やメソッドなどがあります。

RestKitの設計者が採用した可能性のある別のアプローチは、RKObjectManagerクラスメソッドのみを使用してクラスを作成し、静的グローバル変数を介してその状態をカプセル化することでした。

このように、クラスをインスタンス化するという概念すらなく、そのメソッドを直接呼び出すことができます。一方、Objective-Cでは、言語がクラスメンバー変数(たとえばC ++とは対照的に)をサポートしておらず、シングルトンクラスのリファクタリング性が高いため、これはかなり貧弱な設計上の決定です。 。

于 2012-10-14T06:56:02.533 に答える
1

オブジェクトがそれ自体に関連付けられたデータにアクセスする必要がある場合、オブジェクトはインスタンス変数(ivars)を使用してそのデータを格納します。ただし、インスタンス変数はクラスの特定のインスタンスの一部であり、クラス自体ではありません。クラスメソッドからはアクセスできません。したがって、あなたが話しているマネージャークラスがそのプライベートデータを格納/アクセスすることであった場合、それは共有インスタンス(シングルトン)を使用してインスタンス変数を作成します。クラスとしてのみ使用された場合は、プライベートデータをグローバル変数に格納する必要がありました。これはCでは悪い習慣と見なされています。

また、よく見ると、RKObjectManagerクラスにはプロパティがあります。Objective-Cでは、プロパティは常に基になるインスタンス変数によってサポートされます(実行時、動的、またはコンパイル時に宣言された方法で作成されます)-そのため、クラスはプロパティを持つことができず、そのためシングルトン(クラスの実際のインスタンス)が必要です。

シングルトンなしの例(醜い):

static int uglyGlobalVar;

@interface UglyClass: NSObject

+ (void)storeData:(int)data;

@end

@implementation UglyClass: NSObject

+ (void)storeData:(int)data
{
    uglyGlobalVar = data;
}

@end

シングルトンの例(はるかに良い):

@interface GoodClass: NSObject {
    int data;
}

+ (GoodClass *)sharedInstance;

@property (nonatomic, assign) int data;

@end

@implementation GoodClass: NSObject

@syntehsize data;

// also implement sharedInstance here

@end

// then this class is usable as:
[GoodClass sharedInstance].data = 1337;
于 2012-10-14T06:56:13.397 に答える