关于如何使用NSMutableArray和Singleton的困惑

时间:2014-12-06 08:09:36

标签: objective-c nsmutablearray singleton shopping-cart singleton-methods

我第一次尝试使用单身人士。我希望有一个全局的数组,我的所有视图控制器都有一些特殊的方法来添加和删除项目(这是购物车的一种东西)。

我的单身类名为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];
}

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

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

或者类似的东西:

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

以上单身对象都是零。

我是新手单身人士和一般的目标C.我很感激任何建议。我已阅读了很多类似的Stack Overflow链接,但在我的情况下并没有完全理解它。

3 个答案:

答案 0 :(得分: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,并始终访问相同的单例实例。

答案 1 :(得分:0)

每次请求共享管理器为您提供单例类的实例时,您正在初始化对象。 将其替换为您的共享管理器,然后尝试一下:

static Cart *cartObject = nil;
+ (id)sharedManager {
    if (cartObject == nil)
        cartObject = [[self alloc] init];
    return cartObject;
  }

答案 2 :(得分: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];