2012-04-07 3 views
4

Я нахожу, что когда я инициализирую новый дочерний класс, я получаю объект возвращаемого родительского класса.Могу ли я подклассифицировать ViewController, созданный с помощью раскадровки?

Родитель:

- (id)init 
{ 
    self = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"EditController"];   
    return self; 
} 

Ребенок:

- (id)init 
{ 
    NSLog(@"New child"); 
    self = [super init]; 
    return self; 
} 

Если я Alloc и инициализации ребенка, он отображает New child, но возвращает мне объект класса родителя. Методы вызова, объявленные только в дочернем, приводят к сбою.

Может ли кто-нибудь объяснить, как здесь работает процесс инициализации, и как я могу создать дочерний объект?

+1

Моим обходным решением будет использование стандартного XIB вместо раскадровки, но мне все еще интересно. –

+1

Yup, новый вопрос, но один с фактическим ответом! –

+0

Извините, я действительно задал вопрос, когда увидел другого (и подумал, что он старше, так как он получил больше внимания ...), и только потом заметил дату на обоих (по крайней мере, ваш не отмечен как «дубликат», но как «имеет ответ в другом месте», который правильный и не уничижительный для вас) ... – Rick77

ответ

0

Я бы поспорил, что авария вызвана родителем init, возвращая autoreleased экземпляр EditController. В любом случае, почему бы вам просто не задать тип класса для типа ребенка непосредственно в раскадровке?

+0

У меня есть несколько дочерних классов, наследующих одни и те же базовые элементы, поэтому я думаю, что мне нужны в основном одинаковые копии в раскадровке, нет? XIB отлично работает для меня. Я не уверен, как это может быть проблемой автозапуска, поскольку пул не должен иметь возможность очистить к моменту вызова дочернего init, а также, если я назначу init'ed родительским классом Storyboard, он сохраняется до Я явно освобождаю его ... –

+0

Да, в этом случае использование XIB будет иметь больше смысла. Что касается проблемы с памятью, то в опубликованном вами коде вы переписываете 'self' с ** autoreleased ** экземпляром, полученным из' UIStoryboard', который, по меньшей мере, является ошибкой программирования (идет вразрез с соглашениями об именах). – Lvsti