Настройка NSMutableArray - Может кто-нибудь объяснить, что делает этот фрагмент кода? - PullRequest
0 голосов
/ 16 июля 2009

Я нашел этот фрагмент кода в сети. Он устанавливает NSMutableArray так, как я раньше не видел (я новичок в Obj-C) Может кто-нибудь объяснить, что он делает и почему вы так поступите? В частности, знак @syncronized, static и little plus на сигнатуре метода.

add the following to the .h file:
+(NSMutableArray *)allMySprites;

add the following to he .m file after implementation:

static NSMutableArray * allMySprites = nil;

+(NSMutableArray *)allMySprites {
    @synchronized(allMySprites) {
        if (allMySprites == nil)
            allMySprites = [[NSMutableArray alloc] init];
        return allMySprites;
    }
 return nil;

}

Ответы [ 3 ]

6 голосов
/ 16 июля 2009

Добавление к другим ответам ... отправленный код неверен. Это должно быть больше так:

@implementation SpriteManager
+ (NSMutableArray*) allMySprites {
    @synchronized(self) {
        if (allMySprites == nil) {
            allMySprites = [[NSMutableArray alloc] init];
        }
    }
    return allMySprites;
}
@end

Нет смысла @synchronize на нуле. Использование self в методе класса относится к классу, а не к экземпляру. Также «возвращать ноль» в исходном коде бессмысленно.

Лучший подход, при котором можно полностью избежать @synchronized, - это использовать метод инициализации класса:

@implementation SomeClass
+ (void) initialize
{
    allMySprites = [[NSMutableArray alloc] init];
}
@end

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

1 голос
/ 16 июля 2009

Это реализация шаблона проектирования Singleton , в основном способ убедиться, что у вас есть только одна копия вашего MySprites.

Подробности:

  • + означает, что это метод класса
  • @syncyronize делает доступ к переменной allMySprites поточно-безопасной (есть несколько предостережений, но это сводка в одну строку)
  • Я считаю, что static ограничивает область действия переменной только файлом
1 голос
/ 16 июля 2009

Знак + указывает, что метод является static в отличие от instance методов. Это означает, что метод принадлежит классу, а не каждому экземпляру класса (точно так же как static вещи в Java и C # ). @synchronized получает блокировку для указанного объекта ( как оператор lock в C # ). Это означает, что никакой другой поток не может войти в блок @synchronized с этим объектом.

Код в целом пытается инициализировать одноэлементную коллекцию в первый раз (когда она еще не инициализирована) и кэшировать ее для использования при последующих вызовах этого метода. Синхронизированный блок создает критическую секцию , чтобы обеспечить безопасность части инициализации в случае состояния гонки, когда два потока пытаются получить значение примерно в одно и то же время, пока еще выполняется инициализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...