Как создать статический NSMutableArray в классе в Objective c?

У меня есть класс A, который является суперклассом как для класса B, так и для класса C. Мне нужно хранить объекты класса A в «статическом» массиве NSMutablearray, определенном в классе A. Можно ли изменить данные, хранящиеся в MSMutableArray, с использованием методов в классе B и Класс С? Как создать и инициализировать статический массив? Пример был бы более полезным. заранее спасибо.


person Ka-rocks    schedule 06.10.2010    source источник


Ответы (1)


Вот один из способов сделать это.

@interface ClassA : NSObject
{
}

-(NSMutableArray*) myStaticArray;

@end

@implementation ClassA

-(NSMutableArray*) myStaticArray
{
    static NSMutableArray* theArray = nil;
    if (theArray == nil)
    {
        theArray = [[NSMutableArray alloc] init];
    }
    return theArray;
}

@end

Это шаблон, который я использую довольно часто вместо настоящих синглетонов. Объекты ClassA и его подклассы могут использовать его следующим образом:

[[self myStaticArray] addObject: foo];

Есть варианты, которые вы можете рассмотреть, например. вы можете сделать метод методом класса. Вы также можете сделать метод потокобезопасным в многопоточной среде. например

-(NSMutableArray*) myStaticArray
{
    static NSMutableArray* theArray = nil;
    @synchronized([ClassA class])
    {
        if (theArray == nil)
        {
            theArray = [[NSMutableArray alloc] init];
        }
    }
    return theArray;
}
person JeremyP    schedule 06.10.2010
comment
не приведет ли это к утечке памяти для theArray? - person tbag; 13.04.2013
comment
Он вообще не будет протекать - theArray определен как статический массив, поэтому он будет создавать экземпляр этого объекта только один раз. - person deathhorse; 24.07.2014
comment
@JeremyP только что нашел это сейчас. Просто хотел поздороваться за это. Отличное решение! - person skålfyfan; 21.08.2014
comment
@JeremyP на самом деле дополнительный вопрос. Где мы освобождаем или обнуляем массив, когда приложение закрывается? Это работает для меня, когда мое приложение впервые запускается, но если я закрою свое приложение, мой NSMutableArray никогда не будет заполнен данными. Вам нужно myArray = [myObject myStaticArray]; myArray = nil; избавиться от него? - person skålfyfan; 21.08.2014
comment
@skålfyfan Массив никогда не освобождается, потому что он никогда не освобождается. Обычно это не проблема, потому что адресное пространство в любом случае будет уничтожено. Если вам нужно выполнить какие-либо действия по очистке, которые зависят от освобождения объектов, вам нужно явно запустить их при закрытии приложения. - person JeremyP; 22.08.2014
comment
@JeremyP добавленный вами '@synchronized' сделает только поток инициализации безопасным (поправьте меня, если я ошибаюсь). Операция чтения и записи в этот массив не будет безопасной..? - person Ankit Srivastava; 25.07.2019
comment
@AnkitSrivastava Правильно. Вам нужно будет добавить другую синхронизацию, чтобы сделать доступ потокобезопасным. - person JeremyP; 26.07.2019