У меня есть класс A, который является суперклассом как для класса B, так и для класса C. Мне нужно хранить объекты класса A в «статическом» массиве NSMutablearray, определенном в классе A. Можно ли изменить данные, хранящиеся в MSMutableArray, с использованием методов в классе B и Класс С? Как создать и инициализировать статический массив? Пример был бы более полезным. заранее спасибо.
Как создать статический NSMutableArray в классе в Objective c?
Ответы (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
не приведет ли это к утечке памяти для theArray?
- person tbag; 13.04.2013
Он вообще не будет протекать - theArray определен как статический массив, поэтому он будет создавать экземпляр этого объекта только один раз.
- person deathhorse; 24.07.2014
@JeremyP только что нашел это сейчас. Просто хотел поздороваться за это. Отличное решение!
- person skålfyfan; 21.08.2014
@JeremyP на самом деле дополнительный вопрос. Где мы освобождаем или обнуляем массив, когда приложение закрывается? Это работает для меня, когда мое приложение впервые запускается, но если я закрою свое приложение, мой NSMutableArray никогда не будет заполнен данными. Вам нужно
myArray = [myObject myStaticArray]; myArray = nil;
избавиться от него?
- person skålfyfan; 21.08.2014
@skålfyfan Массив никогда не освобождается, потому что он никогда не освобождается. Обычно это не проблема, потому что адресное пространство в любом случае будет уничтожено. Если вам нужно выполнить какие-либо действия по очистке, которые зависят от освобождения объектов, вам нужно явно запустить их при закрытии приложения.
- person JeremyP; 22.08.2014
@JeremyP добавленный вами '@synchronized' сделает только поток инициализации безопасным (поправьте меня, если я ошибаюсь). Операция чтения и записи в этот массив не будет безопасной..?
- person Ankit Srivastava; 25.07.2019
@AnkitSrivastava Правильно. Вам нужно будет добавить другую синхронизацию, чтобы сделать доступ потокобезопасным.
- person JeremyP; 26.07.2019