我正在努力学习编程,我选择开始的语言是客观的c! 我目前正在学习:在Objective-C第四版编程,并且在课程章节中有点卡住了。
我们有以下代码:
#import <Foundation/Foundation.h>
@interface Fraction: NSObject;
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
@end
@implementation Fraction
{
int numerator;
int denominator;
}
-(void) print
{
NSLog(@"%i/%i" , numerator, denominator);
}
-(void) setNumerator:(int)n
{
numerator = n;
}
-(void) setDenominator:(int)d
{
denominator = d;
}
@end
int main (int argc, char * argv[])
{
@autoreleasepool {
Fraction *myFraction;
myFraction = [Fraction alloc];
myFraction = [Fraction init];
[myFraction setDenominator:1];
[myFraction setNumerator:3];
NSLog(@"The value of myFraction is :");
[myFraction print];
}
return 0;
}
我从书中复制了代码,希望能帮助我更好地理解它,但出于某种原因,当我尝试运行时,我得到以下信息:
2014-04-25 22:23:28.374 cocoTerminal[1751:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[Fraction<0x1000011d8> init]: cannot init a class object.'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff8f5a825c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff86403e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8f5ab490 +[NSObject(NSObject) dealloc] + 0
3 cocoTerminal 0x0000000100000dde main + 110
4 libdyld.dylib 0x00007fff8d43a5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
如果有人会如此善意地解释导致错误的原因和原因,那么我将永远感激不尽!
答案 0 :(得分:1)
答案 1 :(得分:0)
这一行:
myFraction = [Fraction init];
是导致cannot init a class object
例外的原因。它应该是:
myFraction = [myFraction init];
您向{em>类发送alloc
条消息,但向类的实例发送init
条消息。您无法将init
发送到类对象,因为错误明确指出。向类中发送alloc
会为您提供该类的实例,并且该实例是您应该将init
发送到的实例。
正如其他人所说的那样,将这两行合并到Fraction * myFraction = [[Fraction alloc] init];
是更常用的方法,但是一旦你发送了init
消息,你做这件事的方式实际上并没有错正确的事情。