【问题标题】:Calling init Method in Objective C在 Objective C 中调用 init 方法
【发布时间】:2014-07-11 00:27:00
【问题描述】:

我刚刚进入我的 Obj-C 书籍中涉及 init 方法的部分。我理解它们,但我不确定在哪里调用该方法。我有一个 VC 类需要将其 @propertys 之一设置为另一个值,除了在执行其余代码之前的默认值 0。 VC 是UIViewController 的子类。

这是我在 VC.m 中的 init 方法的代码:

- (id)initmethod
{
    if((self = [super init])){
        self.value = -1 ;
    }
    return self ;
}

我该怎么称呼它?我需要有一个调用它的子类吗?还是我需要手动创建链接到视图的 VC 对象并在那里调用这个方法?

【问题讨论】:

  • 仅供参考 - 您最好将 if 更改为 if ((self = [super init])) {。你不想做比较。
  • 将方法的名称更改为 initMethod(大写 M)。初始化方法必须以“init”这个词开头,所以我认为编译器没有识别出当你把它全部小写时。
  • 除非您有充分的理由不这样做,否则请致电 -init。而 init family 可能意味着您应该使用 -initMethod 而不是 -initmethod(按照惯例,大小写在这里很重要)。
  • 当一个对象被默认“创建”时,它应该使用myObject=[[MyObjectClass alloc]init]或等效的快捷方式myObject=[MyObjectClass new]来完成。这就是你的 init 方法被调用的地方。

标签: ios objective-c init


【解决方案1】:

是的,您需要在创建控制器时调用它,

VC *vcInstance = [[VC alloc] initMethod];

其实没有必要创建自己的 init 方法,你可以直接覆盖 init。

但是,如果您在情节提要中制作控制器,则需要覆盖 initWithCoder,并在那里设置您的 value 属性。

-(id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        _value = -1; // you should use the ivar rather than self.propertyName inside an init method
    }
    return self;
}

同样,如果控制器是在 xib 文件中制作的,您应该覆盖 initWithNibName:bundle:

【讨论】:

  • @jazpen,你把它放在子类控制器的 .m 文件中。当你创建一个新的 UIViewController 文件时,你会自动获得 initWithNibName:bundle: 的样板代码。
  • 好的,谢谢!有效。你能引导我到一个可以很好地解释initWithNibName:bundle: 行的页面吗?
  • @jazpen,该方法的描述在 UIViewController 类参考中。
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多