为什么在执行Objective-C程序时出现错误“无法初始化类对象”?

时间:2014-09-18 01:23:32

标签: 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(void){
  id o;
  o = [Volume init];
}

这是我的错误输出:

$cc 96.m -framework Foundation
$./a.out
2014-09-18 10:10:40.116 a.out[759:507] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[Volume<0x1069ca0f8> init]: cannot init a class object.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff9019525c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff951f4e75 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff90198490 +[NSObject(NSObject) dealloc] + 0
    3   a.out                               0x00000001069c9f46 main + 38
    4   libdyld.dylib                       0x00007fff93bab5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Abort trap: 6

这是我的环境:

$cc --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

感谢。

2 个答案:

答案 0 :(得分:3)

使用alloc/init

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

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

[[Volume alloc] init]有效,因为一旦对象alloc,就可以init ialized。

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

使用new

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

使用类对象初始化程序

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

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

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

答案 1 :(得分:2)

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

所以你需要这样做:

o = [[Volume alloc] init];

当前正在做的是尝试在init上调用Volume作为类方法,当它是一个实例方法时(在alloc返回的新实例上调用)。 / p>