【发布时间】: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 会崩溃...?还有其他情况吗?)
提前致谢 莫里茨
【问题讨论】:
-
也许我遗漏了一些东西,但为什么这是非法的? Swift 鼓励这种初始化。
-
例如。苹果文档:developer.apple.com/library/ios/documentation/General/… 我发现其他文档也有相同的说法,但没有人费心说出这是经验法则还是为什么你不能这样做......
标签: ios objective-c