简单的自包含Objective C文件

时间:2011-09-17 03:54:12

标签: objective-c

我正在努力完成所有目标C我可能尽可能快地完成我的新工作。我把训练划分了,所以我用可可教程做了1/2,我认为从一般的角度尝试学习Objective C也是有道理的,所以其他50%我试图从“编程在Objective C“由Stephan Kochan撰写的书(2004)。他在前50页左右的许多例子似乎暗示有一种方法可以在同一个文件中创建一个简单的类(接口,实现和主要)。我一直试图在mac Snowleopard终端中为了速度而编译它,但是一旦我在main中调用一个方法,我就会遇到编译错误。

我知道它不是我的gcc编译器,因为该文件将编译,我甚至可以编写一个printf语句,但是一旦我尝试调用一个方法,我就会遇到编译错误。如果有人能够演示一个实际上与方法调用一起使用的简单包含的objectivec.m文件,我将不胜感激。

这是我的代码

#import <stdio.h>
#import <objc/Object.h>

@interface testing1 : Object
{
int number;
}

-(void) setNum:(int)a;
-(void) print;
@end

@implementation testing1;
-(void) setNum:(int) a{
number = a;
}


-(void) print{

printf("this is the number %i \n", number);

}

@end

int main(int argc, char* argv[] )
{
//testing1 *test =[testing1 new];
//[test setNum: (int)34];
printf("testing");
//[test print];
}

这将使用--- gcc tester1 -o myProg -l objc在终端中编译 我试图用几种不同的方式调用这些方法,但它不起作用

任何帮助表示赞赏。也许我需要分手并使用make - 我不知道 谢谢 MIke

3 个答案:

答案 0 :(得分:2)

; -

末尾有@implementation
@implementation testing1;  // Semi colon shouldn't be present at the end

进行修改后,您应该看到结果。 Online result of the program

[test setNum: (int)34];

这里不需要34到int的类型转换。您只需将消息setNum传递给引用test,然后使用34后跟冒号。

[test setNum:34 ];

接口声明应该在头文件中同时执行源文件。只编译源文件。在编译阶段之前,预处理器只是将所有导入文件的内容复制到翻译单元。所以,

<强> testing.h

#import <Foundation/NSObject.h>
@interface testing1 : NSObject
{
    int number;
}

-(void) setNum:(int)a;
-(void) print;
@end

<强> testing.m

#import <stdio.h>
#import "testing.h"

// You should definitely import just stdio.h header here because of printf function usage
// testing.h also to be imported or else compiler doesn't know what is testing1.

@implementation testing1
-(void) setNum:(int) a{
    number = a;
}
-(void) print{    
    printf("this is the number %i \n", number);
}
@end

<强>的main.m

#import <stdio.h>
#import "testing.h"

int main(int argc, char* argv[] )
{
    testing1 *test =[testing1 new]; 
    [test setNum: 34];
    printf("testing");
    [test print];

     return 0;
}

现在您需要编译生成相应目标文件的两个源文件。链接器将这些目标文件组合在一起,以提供最终的可执行文件。

gcc -o test testing.m main.m -framework Foundation

运行 -

./test

答案 1 :(得分:2)

你所关注的书已经过时了。 Object类在1994年引入OpenStep后实际上被弃用了。

在Objective-C 2.0中,Object类根本不可用。这就是你的程序产生编译器警告/错误的原因。

您应该改为继承NSObject并导入<Foundation/Foundation.h>。使用-framework Foundation gcc参数,而不是-l objc

答案 2 :(得分:0)

首先,您使用了#import&lt; stdio.h&gt;。只在你使用C时才需要它。删除句子并改为使用它。


#import <Foundation/Foundation.h>

其次,为什么使用#import&lt; objc / Object.h&gt;? “&lt;”和“&gt;”仅适用于框架。如果要导入另一个文件,请改用#import“Object.h”。 (除非你在谈论NSObject,否则你不需要导入任何东西,因为它是Foundation框架的一部分。)

最后,你应该在@implementation之后拿掉分号,因为这是不必要的。

相关问题