как и где мне инициализировать глобальный NSMutableArray в Xcode 5

Я пытаюсь инициализировать глобальный NSMutableArray, к которому я могу добавить целые числа позже. Мне просто нужно знать, как и где я должен инициализировать свой массив, чтобы к нему можно было получить доступ и изменить любую функцию, которую я буду использовать позже в своей программе. Также я использую Xcode 5 и знаю, что длина массива должна быть 180.


person user2975241    schedule 15.11.2013    source источник


Ответы (4)


В вашем файле AppDelegate.h -

@property(nonatomic,retain) NSMutableArray *sharedArray;

В AppDelegate.m

@synthesize sharedArray;

В didFinishLaunchingWithOptions -

sharedArray = [[NSMutableArray alloc]init];

Сейчас,

создать общий объект AppDelegate, например

mainDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];

и получить доступ к sharedArray, где вы хотите получить доступ, используя-

mainDelegate.sharedArray
person iSmita    schedule 15.11.2013
comment
Куда мне поместить mainDelegate = . . .? Это также входит в didFinishLaunchingWithOptions? - person user2975241; 21.11.2013
comment
mainDelegate — это объект вашего AppDelegate. В файле yourViewController.h инициализируйте AppDelegate *mainDelegate; и в viewDidLoad файла yourViewController.m - mainDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; Таким образом вы можете получить копию AppDelegate с помощью sharedArray. Попробуйте это. - person iSmita; 21.11.2013
comment
Я получаю сообщение об ошибке «Нет видимого @interface для AppDelegate» объявляет селектор «делегат» - person Marko; 13.07.2014

Вы можете создать одноэлементный класс и определить свойство для своего массива в этом классе.

Например:

// .h file
@interface SingletonClass : NSObject
@property (nonatomic,retain) NSMutableArray *yourArray; 
+(SingletonClass*) sharedInstance;
@end

// .m file

@implementation SingletonClass

+(SingletonClass*) sharedInstance{
    static SingletonClass* _shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _shared = [[self alloc] init];
        _shared.yourArray = [[NSMutableArray alloc] init];
     });
     return _shared;
  }

@end
person Marco    schedule 15.11.2013
comment
Вот как это сделать. Довольно плохая практика — добавлять в делегат приложения всевозможные вещи, как было предложено. Я думаю, вам, возможно, придется вместо этого назначить _shared.yourArray. - person gnasher729; 17.02.2014
comment
могу ли я использовать это в не ARC? - person Jongers; 01.06.2016

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

Ниже приведен учебник для синглтонов в задаче C.

http://www.galloway.me.uk/tutorials/singleton-classes/

person manujmv    schedule 15.11.2013
comment
Я следовал руководству и инициализировал свой массив. Затем я попытался заменить объект в массиве, используя: [idArray replaceObjectAtIndex:nextIndex withObject:[NSString stringWithFormat:@"red"]]; Затем я попытался напечатать свой массив в консоли, используя nslog, но он возвращает null; поэтому я все еще неправильно инициализирую массив или неправильно использую replaceObjectAtIndex? - person user2975241; 21.11.2013
comment
если ваш массив возвращает null, то вы не можете инициализировать массив - person manujmv; 21.11.2013

Вы можете инициализировать свой массив в методе application:didFinishLaunchingWithOptions: делегата приложения, так как он вызывается почти сразу после запуска вашего приложения:

// In a global header somewhere
static NSMutableArray *GlobalArray = nil;

// In MyAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    GlobalArray = [NSMutableArray arrayWithCapacity:180];
    ...
}

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

// In a global header somewhere
NSMutableArray * MyGlobalArray (void);

// In an implementation file somewhere
NSMutableArray * MyGlobalArray (void)
{
    static NSMutableArray *array = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        array = [NSMutableArray arrayWithCapacity:180];
    });
    return array;
 }

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

Однако это не считается хорошей практикой проектирования в объектно-ориентированном программировании. Подумайте, для чего нужен ваш массив, и, возможно, сохраните его в объекте-одиночке, который управляет связанными функциями, а не храните его глобально.

person Greg    schedule 15.11.2013