Я хотел бы установить переменную-член в производном объекте до того, как я назову [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
Возможно, мне что-то не хватает, но почему это незаконно? Свифт поощряет такую инициализацию. –
например. apple docs: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html # // apple_ref/doc/uid/TP40010810-CH6-SW58 Я нашел другие документы, которые говорят те же, но никто не мешает сказать, является ли это эмпирическим правилом или почему вы не можете этого сделать ... – moritz
https: // разработчик. apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW58 – moritz