【问题标题】:do something before [super init] in objective-c在objective-c中的[super init]之前做一些事情
【发布时间】:2015-08-28 12:34:06
【问题描述】:

我想在调用 [super init] 之前在派生对象中设置一个成员变量。 我所能找到的只是你不应该做这样的事情。无论如何,我的工作是有效的,但实际上我想知道违反规则的后果是什么。如果有正确的方法来解决这个问题,甚至更好。

细节:

我有几个包装器将 c++ 对象绑定到一个 Objective-c 对象(主要是 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++ 对象。 出现问题是因为 initWithFrame 在内部使用 setContentOffset 初始化其内容。因此,在我可以“合法地”设置指向我的 c++ 对象的链接之前调用此方法。

我可以通过检查是否设置了 m_p 来实现我的覆盖(幸运的是它被初始化为 nil)。但是我必须在 init 方法之后同步视图的状态和我的 c++ 对象。在这个例子中,这没什么大不了的,但其他类似的事情要复杂得多,我最终得到了很多重复初始化步骤的代码,或者让我重新同步,尽管在 [super init...] 我知道之前我是同步的。

有没有一种模式可以解决这个正确(优雅)的问题?

在调用 [super init..]; 之前 int 指针真的那么糟糕吗?

(我假设一个后果是,如果 [super init] 返回 nil 会崩溃...?还有其他情况吗?)

提前致谢 莫里茨

【问题讨论】:

标签: ios objective-c


【解决方案1】:

Objective-C 中的 init 方法没有什么神奇之处。 alloc 返回您想要的类的对象,所有实例变量都初始化为 0 / nil / NULL / 0.0 等。然后每个 init 方法只执行开发人员编写的代码。

有些事情显然很愚蠢,比如设置超类的实例变量,然后调用 [super init] 会立即覆盖它。而且您需要注意,init 不一定返回 self,而是返回一个不同的对象,在这种情况下,您在调用 [super init] 之前在基类中初始化的所有内容都将消失。

【讨论】:

    【解决方案2】:
    // illegal but works?
    

    不,这不违法。在对象的超类的初始化程序运行之前对其进行处理是完全合法的,尽管非常规。它仍然可能导致意外的行为和错误,但它本身并不违法。有时它甚至是必要的,例如当您想要执行一些计算并将该计算的结果委托给超类的初始化程序时。

    【讨论】:

      【解决方案3】:

      你使用了错误的初始化

      试试这个:

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

      【讨论】:

      • my_scrollview * scroll = [[my_scrollview alloc] initWithframe:....]; [scroll setContentOffset:....]
      • 重点是我希望 m_p 在 initWithFrame 调用其他成员方法时已经有效(在示例中为 setContentOffset)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多