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

这是购物车.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];
}

然后在我的一个视图控制器中,我试图将一个自定义对象(包含字符串和 NSNumber)传递给我的全局数组。

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

或者可能是这样的:

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

以上两个单例对象都为零。

一般来说,我是单身人士和 Objective C 的新手。我会很感激任何建议。我已经阅读了很多类似的 Stack Overflow 链接,但在我的情况下不太明白。

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 回答