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

ios - Objective-C 调用特定的类方法

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

我有一个在初始化器中有这个的类:

@implementation BaseFooClass

-(id) init
{
     if (self = [super init])
     {
          // initialize instance variables that always need to start with this value
     }

     return self;
}

-(id) initWithSomeIntint) someInt
{
     if (self = [self init]) // <-- I need to make sure that I am calling BaseFooClass's init here, not SubFooClass's, does that make sense?
     {
          self.someInt = someInt;
     }

     return self;
}

@end

这一切都很好,花花公子。我的问题是当我实现子类时:

@implementation SubFooClass

-(id) init
{
     return [self initWithSomeInt:0];
}

-(id) initWithSomeIntint) someInt
{

     if (self = [super init]) // <--- Infinite loop (stack overflow  )
     {
          // initialize other variables
     }
}

@end

我基本上需要专门调用BaseFooClassinit而不是SubFooClassinit

我无法更改对象的初始化方式,因为我正在将项目从 C# 转换为在我的 iPad 应用程序中使用。

提前谢谢大家

编辑:

由于有人问,这是我的标题:

@interface BaseFooClass : NSObject

// implicit from NSObject
// -(id) init;

-(id) initWithSomeIntint) someInt;

// more methods

@end

@interface SubFooClass : BaseFooClass

// implicit from NSObject
// -(id) init;

// implicit from BaseFooClass
//-(id) initWithSomeIntint) someInt;


@end



Best Answer-推荐答案


Objective-C 不能以这种方式工作,因为运行时将方法转换为函数调用的方式。 Self 始终是已分配类的实例,即使在调用父类(super class)的方法时也是如此。您需要为您的 BaseClassFoo 创建指定的初始化程序并始终去那里。所以你应该做这样的事情:

@implementation BaseFooClass

-(id) init
{
  return [self initWithSomeInt:0]; // redirect super class's designated initializer
}

-(id) initWithSomeIntint) someInt
{
  if ((self = [super init])) // Designated initializer always calls into super class's designated initializer (in this case, NSObject's designated initializer is init
  {
    self.someInt = someInt;
  }

  return self;
}

@end

@implementation SubFooClass

// Here we don't override init because our super class's designated initializer
// is initWithSomeInt:
// -(id) init
// {
//   return [self initWithSomeInt:0];
// }

// we override this because it's our superclass's designated initializer, plus it
// is ours as well
-(id) initWithSomeIntint) someInt
{
  if ((self = [super initWithSomeInt:someInt]))
  {
    // initialize other sub-class specific variables
  }
}

@end

关于ios - Objective-C 调用特定的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881477/

回复

使用道具 举报

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

本版积分规则

关注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