0

初めてシングルトンを使って実験しています。アイテムを追加および削除するためのいくつかの特別なメソッドを使用して、すべてのビュー コントローラーにグローバルな配列が必要です (これはショッピング カートのようなものです)。

私のシングルトン クラスは Cart と呼ばれます。

これは Cart.h です:

@interface Cart : NSObject  
@property NSMutableArray *cartArray;

+ (Cart *)sharedManager;    // Class method to return the singleton object

- (void)addItemToCart:(id)object;
- (void)removeItemFromCart:(id)object;
- (void)emptyAllItemsFromCart:(id)object;
- (NSMutableArray *)returnArray;

@end

これは Cart.m です:

@implementation Cart

// @property NSMutableArray *cartArray;

NSMutableArray *cartArray;

+ (Cart *)sharedManager
{
    Cart *cartObject = [[Cart alloc]init];
//    self.cartArray = [NSMutableArray new];
    return cartObject;

}

- (void)addItemToCart:(id)object
{
    if(!cartArray){

        cartArray = [NSMutableArray new];
    }

    [cartArray addObject:object];

}
- (void)removeItemFromCart:(id)object
{
    [cartArray removeObject:object];
}
- (void)emptyAllItemsFromCart:(id)object
{
    [cartArray removeAllObjects];
}

次に、ビュー コントローラーの 1 つで、カスタム オブジェクト (文字列と NSNumbers を含む) をグローバル配列に渡そうとしています。

//    Cart *singleton = [Cart sharedManager];
//    [singleton addItemToCart:self.localChosenAccessory];

または多分次のようなもの:

Cart *mySingleton = [Cart sharedManager];
mySingleton.cartArray = self.addToCartArray;

上記の両方のシングルトン オブジェクトは nil になります。

私はシングルトンとObjective C全般に不慣れです。アドバイスをいただければ幸いです。同様のスタックオーバーフローリンクをたくさん読んだことがありますが、私の状況ではよくわかりません。

4

3 に答える 3

0

[Cart sharedManager] メソッドでは、毎回新しいインスタンスを作成しています。それはシングルトンではありません!次のようなものが必要です。

static Cart *managerInstance;
+ (Cart *)sharedManager
{
    if(!managerInstance) {
        managerInstance = [[Cart alloc] init];
        // put code in instance init if you need to initialize array
    }
    return managerInstance;

}

その後、何度でも sharedManager を呼び出すことができ、常に同じシングルトン インスタンスにアクセスできます。

于 2014-12-06T08:17:56.537 に答える
0

共有マネージャーにシングルトン クラスのインスタンスを取得するように依頼するたびに、オブジェクトを初期化しています。これを共有マネージャーに置き換えて、試してみてください。

static Cart *cartObject = nil;
+ (id)sharedManager {
    if (cartObject == nil)
        cartObject = [[self alloc] init];
    return cartObject;
  }
于 2014-12-06T08:19:40.360 に答える
0

作成したオブジェクトを保存することを忘れないでください:

@implementation Cart

static Cart *sharedInstance = nil;

+ (Cart *)sharedInstance {
    static dispatch_once_t pred;        // Lock
    dispatch_once(&pred, ^{             // This code is called at most once per app
        sharedInstance = [[Cart alloc] init];
    });

    return sharedInstance;
}

...

そして、次のように呼び出すことができます:

Cart *mySingleton = [Cart sharedInstance];
[mySingleton addItemToCart:someObject];
于 2014-12-06T08:21:45.540 に答える