Objective-C类用于处理分数

时间:2014-04-25 21:38:45

标签: objective-c class

我正在努力学习编程,我选择开始的语言是客观的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) 

如果有人会如此善意地解释导致错误的原因和原因,那么我将永远感激不尽!

2 个答案:

答案 0 :(得分:1)

init之后你需要alloc对象。

myFraction = [[Fraction alloc] init];

有关您需要执行此操作的详细说明,请查看here

答案 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消息,你做这件事的方式实际上并没有错正确的事情。