Задаване на стойности по подразбиране за свойствата на NSString

Опитвам се да определя препоръчителния начин за задаване на стойности по подразбиране за свойствата на NSString.

Разбирам, че не е безопасно да се използват методи за достъп в init и dealloc методи на клас. Често имам низови константи, на които бих искал да присвоя стойности по подразбиране. Какъв е препоръчителният начин да направите това (като се има предвид, че 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. Тъй като сетерите потенциално могат да имат странични ефекти, които зависят от определени стойности на състоянието, не искате да ги извиквате при частично конструирани/частично разрушени обекти. Много по-добре е просто да присвоите директно към ivars и да пропуснете сетерите по време на init.

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