2011-09-17 16 views
1

私はすべてのObjective Cを実行しようとしています。私はココアのチュートリアルで1/2をやるようにトレーニングを分けたので、一般的な観点からもObjective Cを学ぶことに意味があると思ったので、残りの50%は私が " Programming in Objective C "Stephan Kochan(2004)の著書。最初の50ページまでの彼の例の多くは、単純なクラス(インターフェース、実装、メイン)をすべて同じファイルにする方法があることを暗示しているようです。私はスピードのためにMacのSnowleopard端末でこれをコンパイルしようとしていましたが、メインのメソッドを呼び出すとコンパイルエラーが出ます。シンプルな自己完結型のObjective Cファイル

ファイルがコンパイルされ、printf文を書くこともできますが、メソッドを呼び出すとすぐにコンパイルエラーが発生するため、gccコンパイラではありません。誰かが単純にインクルーシブな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 と、端末にコンパイルされますです

ご迷惑をおかけして申し訳ございません。おそらく、私はそれを破るとメイクを使用する必要がある - 私はあなたが@implementationの終わりに;を持って おかげ マイク

+0

これらのチュートリアルを実行します。この例は簡単に理解できます。 http://www.otierney.net/objective-c.html – Mahesh

答えて

2

を知らない - 作られたその変形例に

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

、あなたは結果が表示されるはずです。ここで​​

[test setNum: (int)34]; 

intに34を型キャストは不要です。メッセージsetNumを参照番号testに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対応するオブジェクトファイルが生成される2つのソースファイル。リンカはこれらのオブジェクトファイルを結合して、最終実行可能ファイルを生成します。

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> 
 

第二に、なぜあなたは<にObjC/Object.h >を#importを使用していますか? "<"と ">"はフレームワーク専用です。作成した別のファイルをインポートする場合は、代わりに#import "Object.h"を使用してください。 (NSObjectについて言及していない限り、何もインポートする必要はありません)。

最後に、@implementationの後のセミコロンは不要ですからセミコロンを削除する必要があります。

2

あなたがフォローしている本は古くなっています。 Objectクラスは、OpenStepの導入により、1994年に廃止されました。

Objective-C 2.0では、Objectクラスはまったく使用できません。そのため、あなたのプログラムはコンパイラの警告/エラーを生成します。

NSObjectをサブクラス化し、<Foundation/Foundation.h>をインポートする必要があります。 -l objcの代わりに-framework Foundation gccパラメータを使用します。

関連する問題