2015-08-28 2 views
2

Я хотел бы установить переменную-член в производном объекте до того, как я назову [super init]. Все, что я могу найти, это то, что вы не должны так поступать. Мой worakround, чтобы сделать это так или иначе, работает, но на самом деле мне нравится знать, каковы последствия, когда вы сгибаете правила. Или даже лучше, если есть правильный способ справиться с этим.сделать что-то перед [super init] в объекте-c

ПОДРОБНО.Подробнее:

У меня есть несколько оберток, которые связываются с C++ объект в Objective-C объективистские (в основном UI ... Посмотреть или UI ... Controller)

@interface my_scrollview : UIScrollView 
{ 
    my_c_class* m_p; 
} 
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap; 
-(void) setContentOffset:(CGPoint)contentOffset; 
@end 
@implementation dwin_scrollview_ios 
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap 
{ 
    m_p = pWrap; // illegal but works? 
    return [super initWithFrame: frame]; 
    //m_p = pWrap; // to late because [super init...] already called overriden func. 
} 

В моей перезаписаны setContentOffset-method Мне нужно получить доступ к моему C++ - Object. Проблема возникает из-за того, что initWithFrame внутренне инициализирует свой контент с помощью setContentOffset. Таким образом, этот метод вызывается, прежде чем я могу «закончить» настройку ссылки на мой объект C++.

Я могу реализовать свои переопределения с проверкой, установлен ли m_p (к счастью, он инициализирован нулем). Но мне нужно синхронизировать состояние представления и моего объекта C++ после init-метода. В этом примере это не имеет большого значения, но другие подобные действия намного сложнее, и я получаю много кода, который повторяет шаги инициализации или иным образом возвращает меня в синхронизацию, хотя до [super init ...] я знаю Я был в синхронизации.

Есть ли образец для решения этой проблемы (и элегантный)?

Неужели это так плохо, чтобы ввести указатель перед вызовом [super init ..] ;?

(я предполагаю, что одним из следствий является то, что это выходит из строя, если [супер INIT] возвращает нулевые ...? Любые другие случаи?)

Заранее спасибо Moritz

+0

Возможно, мне что-то не хватает, но почему это незаконно? Свифт поощряет такую ​​инициализацию. –

+0

например. apple docs: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html # // apple_ref/doc/uid/TP40010810-CH6-SW58 Я нашел другие документы, которые говорят те же, но никто не мешает сказать, является ли это эмпирическим правилом или почему вы не можете этого сделать ... – moritz

+0

https: // разработчик. apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW58 – moritz

ответ

2

Там нет ничего магического инициализации методов в объективно- C. alloc возвращает объект класса, который вы хотите, со всеми переменными экземпляра, инициализированными до 0/nil/NULL/0.0 и т. д. Каждый метод init просто выполняет код, написанный разработчиком.

Есть вещи, которые, очевидно, глупы, как установка переменной экземпляра суперкласса, а затем вызов [super init], который быстро перезаписывает его. И вам нужно знать, что init не обязательно возвращает self, а другой объект, и в этом случае все, что вы инициализировали в базовом классе до вызова [super init], исчезнет.

-1

Вы используете неправильные инициализации

попробовать это:

-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap 
{ 
    self = [super initWithFrame: frame]; 
    if (self) { 
     m_p = pWrap; 
    } 
    return self; 
} 
+0

'my_scrollview * scroll = [[my_scrollview alloc] initWithframe: .. ..]; [scroll setContentOffset: ....] ' – AleyRobotics

+1

Дело в том, что я хочу, чтобы m_p уже был действительным, когда initWithFrame вызывает другие методы-члены (в примере setContentOffset) – moritz

0
// illegal but works? 

Нет, это не незаконно. Совершенно законно, хотя и нетрадиционно, делать вещи для объекта до запуска инициализатора суперкласса. Это может привести к неожиданному поведению и ошибкам, но само по себе оно не является незаконным. Иногда это даже необходимо, например, когда вы хотите выполнить некоторые вычисления и делегировать результат этого вычисления в инициализатор суперкласса.

+0

Итак, почему downvote? –

Смежные вопросы