2011-09-17 22 views
1

我試圖貫穿所有的目標C我可能儘可能快地完成我的新工作。我已經分開了我的培訓,所以我用可可教程做了1/2,我認爲從一般的角度來學習Objective C也是有意義的,所以另外50%我試圖從「編程目標C「由Stephan Kochan(2004)撰寫。他的許多例子通過前50頁左右似乎暗示有一種方法可以在同一個文件中創建一個簡單的類(接口,實現和主)。爲了提高速度,我一直試圖在Mac Snowleopard終端中編譯它,但只要我在主內部調用一個方法,我就會收到編譯錯誤。簡單的自包含目標C文件

我知道它不是我的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 - 我不知道 感謝 邁克

+0

查看這些教程。這些例子很容易遵循。 http://www.otierney.net/objective-c.html – Mahesh

回答

2

您在@implementation末有; -

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

隨着所做的修改,你應該看到的結果。​​

[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; 
} 

現在,你需要編譯次e生成相應目標文件的兩個源文件。鏈接器將這些目標文件合併爲一個最終的可執行文件。

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

運行 -

所有的
./test 
+0

據我所知,Object是書中的父類。如果這是一個可可應用程序,並且類實際上分爲.h和.m文件,則它將是@interface tester1:NSObject。 – Miek

+0

@user'NSObject'是所有接口的父類。我不確定'Object'的含義。 – Mahesh

+0

我不知道。本書中的例子使用Object。我唯一能想到的就是我們正在導入objc/Object.h。也許這就是父類。所以我的主要問題是,一個簡單的Objective c文件可以像C++文件一樣書寫,您可以在其中實例化方法並將其與main一起使用,而無需創建單獨的文件?我在網上看不到任何這樣的例子。 – Miek

0

首先,您使用的#import < stdio.h中>。你只需要,當你只使用C。刪除句子並改用它。

 

#import <Foundation/Foundation.h> 
 

其次,你爲什麼要使用#import <objc/Object.h>? 「<」和「>」僅適用於框架。如果要導入另一個文件,請改用#import「Object.h」。 (除非你在談論NSObject,那麼你不需要導入任何東西,因爲它是Foundation框架的一部分。)

最後,你應該在@implementation之後拿掉分號,因爲這是不必要的。

2

您正在關注的圖書已過期。 Object班級在1994年引入OpenStep後被有效地棄用。

在Objective-C 2.0中,Object類完全不可用。這就是爲什麼你的程序產生編譯器警告/錯誤。

您應該改爲NSObject的子類和導入<Foundation/Foundation.h>。使用-framework Foundation gcc參數,而不是-l objc

相關問題