• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在objective-c中的[super init]之前做一些事情

[复制链接]
菜鸟教程小白 发表于 2022-12-13 10:09:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap