0

Я экспериментирую с использованием синглтона в первый раз. Я хотел бы иметь массив, который является глобальным для всех моих контроллеров представления с некоторыми специальными методами для добавления и удаления элементов (это относится к товарам в виде корзины).Путаница относительно использования NSMutableArray и Singleton

Мой одноэлементный класс называется Корзина.

Это 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 в целом. Буду признателен за любые советы. Я прочитал много похожих ссылок переполнения стека, но не совсем понял это в моей ситуации.

ответ

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 столько раз, сколько вы хотите, и всегда добраться до той же одноплодной инстанции.

+0

Спасибо, похоже, что он частично работает (я могу видеть мои объекты в моем массиве, когда я поставил точки останова в моем классе Singleton). Но можете ли вы дать мне пример того, как вызвать мой массив singleton, когда я нахожусь в другом контроллере представления? –

+0

Из почти любого места вы можете получить доступ к своим методам, будь то inline, например 'NSMutableArray * cartArray = [[Cart sharedManager] returnArray]', или если вы выполняете несколько операций, например: 'Cart * theCart = [Cart sharedManager]; NSMutableArray * cartArray = [theCart return Array]; ' – RobP

+0

Спасибо, я смог разобраться, и мой синглтон отлично работает. –

0

Вы инициализируете свой объект каждый раз, когда вы просите общего менеджера получить экземпляр одноэлементного класса. Заменить это с вашим общим менеджером, а затем попробовать его:

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

вы никогда не объявляли этот cartObject, о котором вы говорите ... также, это стиль, но я думаю, что это приводит к проблемам, чтобы опустить скобки {} в квадратных скобках вокруг блоков if. Неизбежно вы намереваетесь добавить строку позже, и это делает не то. – RobP

+0

мы не можем декалировать объект в функцию sharedManager, если мы это делаем, поэтому он всегда будет вызываться всякий раз, когда мы хотим получить доступ к экземпляру этого класса. Мы должны делать это внутри класса, но не в sharedManager. – MuhammadTalhaSiddiqui

+1

правильно, вы должны показать это объявление, чтобы ваш пример был завершен. – RobP

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]; 
Смежные вопросы