Установка значений по умолчанию для свойств NSString

Я пытаюсь определить рекомендуемый способ установки значений по умолчанию для свойств NSString.

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

Например, я понимаю, что следующее небезопасно:

@property (nonatomic, copy) NSString *identifier;
....

- (id) init
{ 
    self = [super initWithLayer:displayLayer];

    if (self != nil)
    {
        self.identifier = @"fireSpell01";
    }

    return self;
}

Это нормально, или рекомендуется сделать это:

identifier = [@"fireSpell01" retain];

Или я должен сделать это:

identifier = [[NSString stringWithString:@"fireSpell01"] retain];

person Jay Haase    schedule 24.11.2010    source источник


Ответы (1)


Просто сделайте это:

identifier = @"fireSpell01";

Нет необходимости retain строки. Строковые константы существуют на протяжении всего жизненного цикла программы, и их никогда не нужно сохранять или освобождать. Выполнение [[NSString stringWithString:@"fireSpell01"] retain] просто создает ненужную копию и бессмысленно.

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

person Adam Rosenfield    schedule 24.11.2010
comment
Это нормально, если релиз вызывается для идентификатора (во время сделки), когда он был назначен напрямую, как вы предлагаете? - person Jay Haase; 24.11.2010
comment
@ Джей Да. Безопасно вызывать retain и release для строковых констант. В противном случае это не имело бы смысла - метод, получающий NSString*, не знает, как он был выделен, и должен иметь возможность обрабатывать его одинаково в любом случае. - person walkytalky; 24.11.2010