Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么会出错;无法初始化类对象";在我执行objective-C程序时发生?_Objective C - Fatal编程技术网

为什么会出错;无法初始化类对象";在我执行objective-C程序时发生?

为什么会出错;无法初始化类对象";在我执行objective-C程序时发生?,objective-c,Objective C,我刚开始学习objective-C。我的第一个问题是我不能运行下面的源代码 以下是我的源代码: #import <Foundation/NSObject.h> #import <stdio.h> @interface Volume : NSObject -(id)init; @end @implementation Volume -(id)init { self = [super init]; return self; } @end int main(vo

我刚开始学习objective-C。我的第一个问题是我不能运行下面的源代码

以下是我的源代码:

#import <Foundation/NSObject.h>
#import <stdio.h>

@interface Volume : NSObject
-(id)init;
@end

@implementation Volume
-(id)init 
{
  self = [super init];
  return self;
}
@end

int main(void){
  id o;
  o = [Volume init];
}

谢谢。

目标C中的类初始化分两个阶段进行:首先为实例分配内存,然后初始化该实例

所以你需要做:

o = [[Volume alloc] init];

您当前正在尝试将
init
作为
Volume
上的类方法调用,而它是一个实例方法(在
alloc
返回的新实例上调用)。

使用
alloc/init

[Volume init]
是无效消息。
init
没有类方法

但是,
[Volume alloc]
会创建一个Volume对象,然后可以在上调用
init

[[Volume alloc]init]
是有效的,因为一旦对象被
alloc
初始化,它就可以被
init
序列化

alloc
在内存中保留对象存在的位置
init
实际上占用了该内存并设置了一个可以使用的对象

使用
新建

如果希望能够调用单个方法而不是
[[Volume alloc]init]
,则可以调用
[Volume new]
。虽然这是有效的,但并不经常使用

使用类对象初始值设定项

还可以实现类方法来创建新卷

+ (instancetype) volume{
    return [[Volume alloc]init];
}

然后,您可以使用
Volume*vol=[Volume]

啊,我明白了,没有你说的类方法。所以我需要首先创建Volume对象。回答得很好。谢谢
o = [[Volume alloc] init];
+ (instancetype) volume{
    return [[Volume alloc]init];
}