“调用initWithNibName时,必须立即返回委托init调用的结果或将其分配给'self'”

时间:2012-02-26 00:49:44

标签: objective-c

出于某种原因,我无法通过获取错误消息来调用initWithNibName方法:“必须立即返回委托init调用的结果或将其分配给'self'”。这是一个ARC perk,因为没有指定nib名称,我无法初始化视图。

以下是.m文件中的代码:

#import "SimpleMotionControllerIntroduction.h"

@implementation SimpleMotionControllerIntroduction

-(id) init
{
    self = [super init];

    if (self)
    {
        [self initWithNibName:@"SimpleMotionIntroductionView" bundle:nil];
    }

    return self;
}

@end

我觉得我正在做一些粗心的错误,之前我曾经使用iOS 5,并制作了一个类似于此的应用程序。提前谢谢。

3 个答案:

答案 0 :(得分:6)

两个粗心的错误:你正在调用两个init方法(1)而忽略第二个方法的结果(2,触发错误信息)。

您永远不应该对一个对象进行两次init次调用。请注意,initWithNibName也会调用init。我认为这实际上会导致无休止的递归并最终导致堆栈溢出。

答案 1 :(得分:4)

将其更改为:

 self = [super initWithNibName:@"SimpleMotionIntroductionView" bundle:nil];

 if (self)
 {
      //custom initialization
 }

 return self;

答案 2 :(得分:4)

如果您的裸-init本身没有进行任何设置,只是推迟到另一个初始化程序,它应该如下所示:

-(id) init
{
    return [self initWithNibName:@"SimpleMotionIntroductionView" bundle:nil];
}

就目前而言,你做错了两件事:丢弃initWithNibName:bundle:的结果,然后重新初始化你的对象(因为initWithNibName:bundle:本身会调用[super init]) 。第一个是错误消息的原因。

一个类中只有一个初始值设定项应该调用 - 这是"designated initializer"。每个其他初始化程序都应该调用那个。