Objective c 目标C未定义的新方法可能是问题所在

Objective c 目标C未定义的新方法可能是问题所在,objective-c,Objective C,我在objective-c中有以下代码,带有警告。我评论的帖子似乎暗示这不是一个大问题;它是一种自动创建的方法。但在我的情况下,如果应该的话,没有给出结果。我不确定我做错了什么。鉴于这是我在objective-C中编写的前几个程序之一,我喜欢验证它,以便熟悉正确的语法。代码如下: #import <stdio.h> #import <objc/Object.h> //---------------interface section------------- @inter

我在objective-c中有以下代码,带有警告。我评论的帖子似乎暗示这不是一个大问题;它是一种自动创建的方法。但在我的情况下,如果应该的话,没有给出结果。我不确定我做错了什么。鉴于这是我在objective-C中编写的前几个程序之一,我喜欢验证它,以便熟悉正确的语法。代码如下:

#import <stdio.h>
#import <objc/Object.h>
//---------------interface section-------------

@interface Fraction: Object
{
  int numerator;
  int denominator;
}
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(void) print;
@end
//-----------------implementation section-------
@implementation Fraction;
//getters
-(int) numerator
{
  return numerator;
}
-(int) denominator
{
  return denominator;
}
//setters
-(void) setNumerator: (int) num
{
  numerator = num;
}
-(void) setDenominator: (int) denom
{
  denominator = denom;
}
-(void) print
{
  printf("The value of the fraction is %i/%i\n", numerator, denominator);
}
@end
//-----------------program section-------------------------
int main (void)
{
  Fraction *myFract;
  myFract = [Fraction new];
  [myFract setNumerator: 1];
  [myFract setDenominator: 3];

  printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]);
  [myFract print];
  [myFract free];
  return 0;
}
以下是输出:

$ ./fraction.exe
The numerator is 0, and the denominator is 0

不确定它是否相关,但我正在使用GNUstep来编译它。我不知道如何在上面运行调试。我试过GDB,但没用。顺便问一下,如果我想充分利用这种语言的优点,我需要一个Mac环境吗?是否有这种语言的非Mac/apple应用程序

对象
是不推荐使用的根类。改用
NSObject
。不要打免费电话。如果您使用的是手动内存管理,请使用
release
。如果您使用的是ARC,那么不要调用任何东西

new
不必受
GNUstep
的支持,因此您应该使用类
alloc
init
模式

@interface Fraction: NSObject
{
    int numerator;
    int denominator;
}
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(void) print;
@end
//-----------------implementation section-------
@implementation Fraction;
//getters
-(int) numerator
{
    return numerator;
}
-(int) denominator
{
    return denominator;
}
//setters
-(void) setNumerator: (int) num
{
    numerator = num;
}
-(void) setDenominator: (int) denom
{
    denominator = denom;
}
-(void) print
{
    printf("The value of the fraction is %i/%i\n", numerator, denominator);
}
@end
//-----------------program section-------------------------
int main (void)
{
    Fraction *myFract = [[Fraction alloc] init];
    [myFract setNumerator: 1];
    [myFract setDenominator: 3];

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]);
    [myFract print];
    [myFract release];
    return 0;
}
您还可以使用属性进行简化,以下是具有自动引用计数的Obj-C2.0语法

@interface Fraction: NSObject

@property (nonatomic, assign) int numerator;
@property (nonatomic, assign) int denominator;

- (void)print;

@end

@implementation Fraction
- (void)print {
   printf("The value of the fraction is %i/%i\n", self.numerator, self.denominator);
}
@end

int main (void)
{
    Fraction *myFract = [[Fraction alloc] init];
    myFract.numerator = 1;
    myFract.denominator = 3;

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]);
    [myFract print];
    return 0;
}

即使使用GNUstep,也应该使用Clang进行编译。GCC不会再这样做了。

我认为GNUstep不支持ARC,尽管在某些情况下他们确实支持标记/清除垃圾收集。@MarkBessey确实支持,但在使用Clang时,请看哦,太酷了。自从我尝试用GNUstep做任何事情以来已经有相当长的一段时间了。默认的GNU步骤不喜欢NSObject。我想我会试试叮当声。我对叮当声知之甚少;为了让我知道我正在下载正确的工具,有人能给我url吗?fraction.m:2:26:致命错误:objc/NSObject.h:没有终止此类文件或目录编译。我在gnustep的objc文件夹中查看过,没有看到NSObject文件。@maverick我很确定您必须为
NSObject
()导入
Foundation
。ARC肯定需要Clang,但你可以不用它。有些非苹果环境的应用程序是用Objective-C编写的,但它被视为一种苹果技术。苹果编译器是定义Objective-C的黄金标准。有没有办法不用购买苹果机器就能稍微了解一下这些库?我喜欢这个产品;我只是现在不想花钱。新的Mac电脑很贵,但你可能会找到一台便宜的二手Mac电脑。如果你只是想学习Objective-C,那么任何可以运行OSX的Mac都应该学习。在非苹果硬件上运行OSX是可能的,尽管这样做违反了苹果的软件许可协议。有关如何创建“Hackintosh”的信息可在互联网上随时获取。谢谢。是的,我认为购买二手迷你车并利用KVM是获得我所知道的最好产品之一的一个好方法。
@interface Fraction: NSObject

@property (nonatomic, assign) int numerator;
@property (nonatomic, assign) int denominator;

- (void)print;

@end

@implementation Fraction
- (void)print {
   printf("The value of the fraction is %i/%i\n", self.numerator, self.denominator);
}
@end

int main (void)
{
    Fraction *myFract = [[Fraction alloc] init];
    myFract.numerator = 1;
    myFract.denominator = 3;

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]);
    [myFract print];
    return 0;
}