我想在调用[super init]之前在派生对象中设置成员变量。 我能找到的就是你不应该做这样的事情。我无论如何都要努力工作,但实际上我想知道弯曲规则后会产生什么后果。如果有正确的方法可以解决这个问题,那就更好了。
详情:
我有几个包装器将c ++对象绑定到objective-c objec(主要是UI ... View或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方法中,我需要访问我的C ++ - Object。 出现问题的原因是initWithFrame使用setContentOffset在内部初始化其内容。所以在我可以“合法地”建立到我的c ++ - 对象的链接之前调用此方法。
我可以通过检查实现我的覆盖是否设置了m_p(幸运的是它被初始化为nil)。但是我必须在init-method之后同步视图的状态和我的c ++ - 对象。在这个例子中这没什么大不了的,但是其他这样的实现要复杂得多,我最终会重复大量的代码重复初始化步骤或者让我重新同步,尽管在[super init ...]之前我知道我同步了。
有没有一种模式可以解决这个问题(优雅)?
在调用[super init ..]之前调整指针是否真的很糟糕??
(我假设一个结果是,如果[super init]返回nil,这会崩溃......?其他任何情况?)
提前致谢 Moritz的
答案 0 :(得分:2)
Objective-C中的init方法没什么神奇之处。 alloc返回所需类的对象,所有实例变量初始化为0 / nil / NULL / 0.0等。然后每个init方法只执行开发人员编写的代码。
有些东西显然是愚蠢的,比如设置超类的实例变量,然后调用[super init],它会立即覆盖它。你需要知道init并不一定会返回self,而是一个不同的对象,在这种情况下,你在调用[super init]之前在基类中初始化的所有东西都将消失。
答案 1 :(得分:0)
// illegal but works?
不,这不违法。尽管是非常规的,但是在它的超类之前对物体做东西是完全合法的。初始化程序已运行。它可能仍然会导致意外的行为和错误,但它本身并不违法。有时它甚至是必要的,例如当你想要执行一些计算并将该计算的结果委托给超类时。初始化程序。
答案 2 :(得分:-1)
您使用了错误的init
试试这个:
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap
{
self = [super initWithFrame: frame];
if (self) {
m_p = pWrap;
}
return self;
}