Могу ли я иметь один NSMutableArray в моем приложении с несколькими представлениями?

У меня есть приложение на основе навигации, которое имеет несколько представлений. Можно ли использовать один NSMutableArray для всего приложения? Могу ли я добавить объекты в этот NSMutableArray в одном представлении, а затем удалить объект из того же NSMutableArray из другого представления? Я пытался

 myappAppDelegate *appDelegate = (myappAppDelegate *)[[UIApplication sharedApplication] delegate];

но он дает мне null, когда я пытаюсь получить доступ к массиву appDelegate. Если кто-нибудь может дать мне какую-либо идею или помощь, ссылку или туториал. Заранее спасибо.


person Piscean    schedule 03.10.2011    source источник
comment
Мне нужно добавить и удалить объект в этот массив. Что вы имеете в виду под этим массивом? Какой массив? Что вы имеете в виду под массивом appDelegate?   -  person dasdom    schedule 03.10.2011
comment
Извините, это моя ошибка. Я отредактировал вопрос.   -  person Piscean    schedule 03.10.2011
comment
Как предлагает alinoz, вам следует подумать об использовании синглтона.   -  person dasdom    schedule 03.10.2011


Ответы (4)


Если у вас есть несколько представлений в вашем приложении, и в этом случае вы хотите, чтобы переменная была доступна для каждого представления, вы всегда должны создавать класс Модель / Данные (синглтон) и определять в нем переменную. . Что-то вроде этого :

//DataClass.h      

@interface DataClass : NSObject {    

NSMutableArray *arrGlobal;     

}    
@property(nonatomic,retain)NSMutableArray *arrGlobal;   
+(DataClass*)getInstance;    
@end  



//DataClass.m    
@implementation DataClass    
@synthesize arrGlobal;    
static DataClass *instance =nil;    
+(DataClass *)getInstance    
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    

            instance= [DataClass new];    
        }    
    }    
    return instance;    
}    

Теперь в вашем контроллере представления вам нужно вызвать этот метод как:

DataClass *obj=[DataClass getInstance];  
obj.arrGlobal = arrLocal; 

Эта переменная будет доступна каждому контроллеру представления. Вам просто нужно создать экземпляр класса Data.

person Nitish    schedule 03.10.2011
comment
в DataClass.m, нужно выпускать arrGlobal или нет? - person Piscean; 03.10.2011
comment
Нет, вам не нужно его выпускать. Он сам освобождается, когда приложение заканчивается. - person Nitish; 03.10.2011
comment
DataClass * obj = [DataClass getInstance]; [obj.arrGlobal addObject: self.currentRunData]; NSLog (@ obj.arrGlobal count:% d, obj.arrGlobal.count); но obj.arrGlobal.count всегда 0 - person Piscean; 03.10.2011
comment
Счетчик массива всегда целочисленный. Это должно быть% i, а не% d. - person Nitish; 03.10.2011
comment
его все еще 0. не имело никакого значения - person Piscean; 03.10.2011
comment
Я только что выписался. Счетчик будет отображаться как 0 в журнале. Сделай одно дело. Просто отладьте свое приложение и проверьте, есть ли на данный момент в массиве объекты или нет. - person Nitish; 03.10.2011
comment
Есть аргументы за и против использования синглтона против использования AppDelegate (хотя в основном аргументы с обеих сторон эмоциональны). Подход AppDelegate должен работать, если его правильно реализовать. - person Hot Licks; 03.10.2011
comment
нет. в массиве нет объекта, но существует объект currentRunData. addObject не помещает его в obj.arrGlobal или может неправильно обращаться к arrGlobal. Нам нужно инициализировать arrGlobal или нет? - person Piscean; 03.10.2011
comment
@DanielRHicks: это мой первый раз, и я новичок в разработке iphone. Возможно, я неправильно использую подход AppDelegate. Я пытался выяснить подробности, но везде говорили, что создайте свойство NSMUtableArray в вашем AppDelegate, а затем используйте эту строку кода. Я сделал это, но не сработало. - person Piscean; 03.10.2011
comment
@Piscean - Вы когда-нибудь действительно создавали NSMutableArray или вы просто объявляли его свойство ?? - person Hot Licks; 03.10.2011
comment
в интерфейсе myAppDelegate: свойство NSObject {NSMutableArray * array;} (неатомарное, сохранить) NSMutableArray * array; а затем в .m синтезировать массив; я пропустил знаки @, потому что stackoverflow не позволял мне это делать - person Piscean; 03.10.2011
comment
@Piscean - Похоже, вы только что объявили свойство и никогда не создавали NSMutableArray и не назначали его свойству. - person Hot Licks; 04.10.2011

Для вашего типа проблемы я бы использовал синглтон.

http://en.wikipedia.org/wiki/Singleton_pattern

Appdelegate также является синглтоном, но вы можете немного уменьшить количество закодированных строк, если используете свой собственный синглтон.

person alinoz    schedule 03.10.2011

Подход AppDelegate должен работать, и вам, вероятно, следует выяснить, почему он не работает, даже если вы используете синглтон.

Заявление для получения указателя appDelegate кажется правильным, поэтому я предполагаю, что указатель на массив либо не устанавливается (и не сохраняется) в вашем классе myappDelegate, либо вы изначально неправильно создали экземпляр AppDelegate .

person Hot Licks    schedule 03.10.2011
comment
Всегда рекомендуется использовать singleton вместо appDelegate. . Также см. это обсуждение . - person Nitish; 03.10.2011
comment
Я видел некоторые обсуждения самопровозглашенных властей. Но в любом случае OP должен выяснить, что он делает не так, поскольку в AppDelegate нет ничего особенного, и он, вероятно, совершит ошибку, которую допустит где-то еще, если он не узнает ошибку своего пути. - person Hot Licks; 03.10.2011

В подходе Singleton добавьте это

instance.arrGlobal = [[NSMutableArray alloc] init];

Сюда:

@synchronized(self)    
{    
    if(instance==nil)    
    {    

        instance= [DataClass new];
        instance.arrGlobal = [[NSMutableArray alloc] init];
    }    
}    
return instance;

Таким образом вы можете инициализировать массив и правильно его использовать.

person Panta    schedule 18.06.2013
comment
Для этого нужно больше голосов. Я не мог заставить приведенный выше ответ работать, пока я не инициализировал глобальный массив, как вы здесь. Спасибо! - person Tim; 14.08.2014