#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 все должно быть в порядке.