OStack程序员社区-中国程序员成长平台

标题: ios - 在objective-c中的[super init]之前做一些事情 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 10:09
标题: ios - 在objective-c中的[super init]之前做一些事情

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

细节:

我有几个包装器将 c++ 对象绑定(bind)到一个 Objective-c 对象(主要是 UI...View 或 UI...Controller)

@interface my_scrollview : UIScrollView
{
  my_c_class* m_p;
}
-(id) initWithFrameCGRect)frame wrapper: (my_scrollview*) pWrap;
-(void) setContentOffsetCGPoint)contentOffset;
@end
@implementation dwin_scrollview_ios
-(id) initWithFrameCGRect)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 方法之后同步 View 的状态和我的 c++ 对象。在这个例子中,这没什么大不了的,但是其他类似的事情要复杂得多,我最终得到了很多重复初始化步骤的代码,或者让我重新同步,尽管在 [super init...] 我知道之前我是同步的。

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

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

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

提前致谢 莫里茨



Best Answer-推荐答案


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

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

关于ios - 在objective-c中的[super init]之前做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32271212/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4