Определить класс в методе инициализации

#objective-c #cocoa #foundation

#objective-c #cocoa #основа

Вопрос:

У меня есть глобальный словарь с Class объектами и NSString ключами. Каждый пользовательский подкласс моего Property класса может зарегистрировать себя в Property суперклассе с помощью

   (void)registerPropertyClass:(Class)pclass forNamePrefix:(NSString *)namePrefix
  

A Property инициализируется с помощью a name и value . Что я хочу сделать сейчас, так это вернуть класс, отличный от метода инициализации, на основе name префикса (если зарегистрированный класс совпадает).

Будет ли что-то подобное правильным?

 - (id)initWithName:(NSString *)name value:(NSString *)value
  id instance = self;

  NSArray *registeredPrefixes = [kCKPropertyClasses allKeys];
  for (NSString *prefix in registeredPrefixes) {
    if ([name rangeOfString:prefix].location == 0) {
      instance = [[kCKPropertyClasses objectForKey:prefix] alloc];
      break;
    }
  }

  self = [instance init];
  if (self) {
    self.name = name;
    self.value = value;
  }
  return self;
}
  

ОБНОВЛЕНИЕ: Забыл упомянуть, что в этом проекте используется ARC (поэтому нет сохранения / выпуска)

Комментарии:

1. Я предлагаю изменить цикл, чтобы получать только класс, и переместить alloc в тот же оператор, что и init . Всегда лучше сохранять alloc и init в паре друг с другом. И поскольку вы используете ARC, вы можете захотеть заменить пару alloc и init на new . Наконец, получение allKeys не обязательно; вы можете выполнить итерацию по словарю напрямую, и он выдаст свои ключи.

Ответ №1:

Без его компиляции это сработает, но произойдет утечка при ручном сохранении выпуска. Вам необходимо сделать это release self до переназначения self = [instance init]; .

С ARC все должно быть в порядке.