我刚开始学习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
感谢。
答案 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>