在objective-c

时间:2015-08-28 12:34:06

标签: ios objective-c

我想在调用[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的

3 个答案:

答案 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;
}