iPhone開発のObjective-C学習(1)Objective-Cにおける@classと#importの問題
8536 ワード
Objective-Cで@classと#importの質問です.リファレンス .
たとえば、ClassAとClassBの2つのクラスがあります.2つのクラスが相互に使用され、circular dependency(ループ依存)が構成されています.ヘッダファイルに#importだけで相手のヘッダファイルが含まれている場合(circular inclusionsを構成し、ループが含まれている場合)、コンパイラはエラーを報告します.
Expected specifier-qualifier-list before ‘ClassA’
または
Expected specifier-qualifier-list before ‘ClassB’
ループが含まれないようにClassA.hファイルに@class classBでclassBを含め、同様に、ClassB.hファイルに@class ClassAでClassAを含めます.@class命令はコンパイラに伝えるだけで、これはクラスで、ポインタを保存するために空間を残しておけばいいです.
次はClassAでmとClassB.mには、オブジェクトを含むメンバーにアクセスする場合があります.この場合、コンパイラにより多くの情報を知らせる必要があります.たとえば、そのクラスに呼び出す方法がある場合は、#importを使用して、使用するクラスを再び含め、コンパイラに必要な追加情報を伝えなければなりません.
そうでない場合、コンパイラは警告します.
warning: receiver ‘ClassA’ is a forward class and corresponding @interface may not exist
Categoriesのあるクラスを使用する場合もあります.hヘッダファイルにCategoriesを#importで含めます.
要するに、使用原則は次のとおりです.ヘッダファイルにはimportスーパークラス のみメッセージファイルのimportメッセージを送信するクラス 他の場所で@class転向声明
転載先:FLYBLOG[http://www.flyblog.info]
前に書いたように、Objective-Cに関する知識を書きたいのは、この1年間、アップルやiPhoneの開発に携わってきたためで、その中でも多くの曲がり角を歩み、他のネットユーザーからも多くの助けを得たので、自分の勉強の心得を書いて、必要な友达を参考にしたいと思っています.以下の内容は,読者に一定のソフトウェア開発経験があると仮定する.
アップルMac OSXシステムで開発したい場合、Objective-Cは最も重要な開発言語であり、現在AppleはCocoaライブラリベースのグラフィックインタフェースに開発の重点を置いており、C++をサポートするCarbonグラフィックライブラリはすでに主導的な地位を譲っているが、CocoaライブラリはObjective-C言語を応用して開発されている.C/C++のプログラミング経験がある場合は、Objective-Cの開発が容易になります.Objective-C自体がC/c++のスーパーセットであり、C/C++のすべての特性と標準Cライブラリをサポートしていますが、文法自体はより美しく簡潔で、OO思想、つまり面向オブジェクトを体現することができます.
Objective-Cを学ぶ前にObjective-Cを(以下、O-Cに置き換えます)、Cocoa、CarbonおよびXCodeなどいくつかの名詞の概念が明らかになり、Objective-Cは開発言語であり、前述したように、O-Cはc/c++の超集合であり、Cocoaはアップルシステム上でO-Cが実現したグラフィック開発ライブラリはwindowsシステムのwin 32 SDKとMFCに相当し、Carbonは初期のアップルオペレーティングシステム上のC/C++グラフィックライブラリもMFCに相当し、XCodeは開発であるWindowsシステムのVisual Stdioシリーズに相当する統合環境.
以上、アップルのシステム開発の基本概念を紹介しましたが、Objective-Cの基礎知識を紹介します.変数タイプObjective-CはCのすべてのタイプをサポートし、つまりchar、unsigned char、int、long、float、doubleなどが使用できます.日付などの構造タイプの構造定義
?
View Code OBJC
列挙、および事前定義変数などの他のタイプは、c言語と同じ である.ファイル参照、タイプインポートObjective-Cでは依然として#includeを使用して他のファイルを導入することができますが、#importを使用して他のタイプをインポートすることをお勧めします.公式ドキュメントでは、エラーを減らすことができると説明しています. idタイプidはObjective-Cの特殊なタイプで、彼はオブジェクトを指しています.cのvoid* と理解できます.文字列Objective-Cには、「string」などのcタイプの文字列、またはNSStringタイプの文字列があり、一般的には@「string」で表され、「@」は文字列「string」をNSStringタイプ に変換する.
以上は基本的な言語知識であり、その多くはc/c++と同じであり、これまで#import以外の内容はC/C++開発者にとってよく知られていた.
ここではまずクラスを呼び出す方法から始め、次のコードを見てみましょう.
?
View Code OBJC
そう、Objective-Cはこのようにメソッド呼び出しを行い、C/c++とは異なり「[]」の使用であり、[]はクラスオブジェクトを呼び出すメソッドを表し、objectはクラスオブジェクトであり、methodは呼び出されたメソッドであり、パラメータ付きのメソッドを呼び出すことができますが、メソッド名とパラメータの間に「:」を残してコンパイラにコンパイル方法を通知します.メソッドには、次のような戻り値もあります.
?
View Code OBJC
NSStringのようなクラスのメソッドを呼び出すこともできます
?
View Code OBJC
ここでメソッドstringはNSStringクラスの特殊なメソッドであり、c++の静的メンバー関数に似ています.
C++のresult=object 1のような多重メソッド呼び出し.function1 ( object2.function2() );O-Cではこのように実現できます
?
View Code OBJC
コードの最外層[]はobject 1呼び出しfunction 1メソッドを表し、中の[]はobject 2呼び出しfunction 2の結果をfunction 1のパラメータとして伝達する
c/c++のobjectなどのマルチパラメータメソッド呼び出し.function(arg1, arg2,arg3 );O-Cではこのようにすべきで、まず方法の申明です
?
View Code OBJC
呼び出し時はこんな感じ
?
View Code OBJC
すなわち、メソッド名の後にパラメータのリストが直接表示されます.最初のパラメータには別名が必要ではありません.他のパラメータには別名が設定されている必要があります.O-Cはパラメータ別名を使用して呼び出されたパラメータを決定します.これにより、コンパイラはパラメータ間を1-Nのスペースで区切ることができます.
たとえば、ClassAとClassBの2つのクラスがあります.2つのクラスが相互に使用され、circular dependency(ループ依存)が構成されています.ヘッダファイルに#importだけで相手のヘッダファイルが含まれている場合(circular inclusionsを構成し、ループが含まれている場合)、コンパイラはエラーを報告します.
Expected specifier-qualifier-list before ‘ClassA’
または
Expected specifier-qualifier-list before ‘ClassB’
ループが含まれないようにClassA.hファイルに@class classBでclassBを含め、同様に、ClassB.hファイルに@class ClassAでClassAを含めます.@class命令はコンパイラに伝えるだけで、これはクラスで、ポインタを保存するために空間を残しておけばいいです.
次はClassAでmとClassB.mには、オブジェクトを含むメンバーにアクセスする場合があります.この場合、コンパイラにより多くの情報を知らせる必要があります.たとえば、そのクラスに呼び出す方法がある場合は、#importを使用して、使用するクラスを再び含め、コンパイラに必要な追加情報を伝えなければなりません.
そうでない場合、コンパイラは警告します.
warning: receiver ‘ClassA’ is a forward class and corresponding @interface may not exist
Categoriesのあるクラスを使用する場合もあります.hヘッダファイルにCategoriesを#importで含めます.
要するに、使用原則は次のとおりです.
転載先:FLYBLOG[http://www.flyblog.info]
前に書いたように、Objective-Cに関する知識を書きたいのは、この1年間、アップルやiPhoneの開発に携わってきたためで、その中でも多くの曲がり角を歩み、他のネットユーザーからも多くの助けを得たので、自分の勉強の心得を書いて、必要な友达を参考にしたいと思っています.以下の内容は,読者に一定のソフトウェア開発経験があると仮定する.
アップルMac OSXシステムで開発したい場合、Objective-Cは最も重要な開発言語であり、現在AppleはCocoaライブラリベースのグラフィックインタフェースに開発の重点を置いており、C++をサポートするCarbonグラフィックライブラリはすでに主導的な地位を譲っているが、CocoaライブラリはObjective-C言語を応用して開発されている.C/C++のプログラミング経験がある場合は、Objective-Cの開発が容易になります.Objective-C自体がC/c++のスーパーセットであり、C/C++のすべての特性と標準Cライブラリをサポートしていますが、文法自体はより美しく簡潔で、OO思想、つまり面向オブジェクトを体現することができます.
Objective-Cを学ぶ前にObjective-Cを(以下、O-Cに置き換えます)、Cocoa、CarbonおよびXCodeなどいくつかの名詞の概念が明らかになり、Objective-Cは開発言語であり、前述したように、O-Cはc/c++の超集合であり、Cocoaはアップルシステム上でO-Cが実現したグラフィック開発ライブラリはwindowsシステムのwin 32 SDKとMFCに相当し、Carbonは初期のアップルオペレーティングシステム上のC/C++グラフィックライブラリもMFCに相当し、XCodeは開発であるWindowsシステムのVisual Stdioシリーズに相当する統合環境.
以上、アップルのシステム開発の基本概念を紹介しましたが、Objective-Cの基礎知識を紹介します.
?
View Code OBJC
1
2
3
4
5
6
struct
Date
{
unsigned
char
day;
unsigned
char
month;
unsigned
char
year;
}
;
列挙、および事前定義変数などの他のタイプは、c言語と同じ
以上は基本的な言語知識であり、その多くはc/c++と同じであり、これまで#import以外の内容はC/C++開発者にとってよく知られていた.
ここではまずクラスを呼び出す方法から始め、次のコードを見てみましょう.
?
View Code OBJC
1
2
[
object method]
;
[
object methodWithParamter:
param]
;
そう、Objective-Cはこのようにメソッド呼び出しを行い、C/c++とは異なり「[]」の使用であり、[]はクラスオブジェクトを呼び出すメソッドを表し、objectはクラスオブジェクトであり、methodは呼び出されたメソッドであり、パラメータ付きのメソッドを呼び出すことができますが、メソッド名とパラメータの間に「:」を残してコンパイラにコンパイル方法を通知します.メソッドには、次のような戻り値もあります.
?
View Code OBJC
1
2
result =
[
object methodWithRetValue]
;
result =
[
object methodwithPrameterAndRetValue:
param]
;
NSStringのようなクラスのメソッドを呼び出すこともできます
?
View Code OBJC
1
NSString
*
string
=
[
NSString
string
]
;
ここでメソッドstringはNSStringクラスの特殊なメソッドであり、c++の静的メンバー関数に似ています.
C++のresult=object 1のような多重メソッド呼び出し.function1 ( object2.function2() );O-Cではこのように実現できます
?
View Code OBJC
1
result =
[
object1 function1:
[
object2 function2]
]
;
コードの最外層[]はobject 1呼び出しfunction 1メソッドを表し、中の[]はobject 2呼び出しfunction 2の結果をfunction 1のパラメータとして伝達する
c/c++のobjectなどのマルチパラメータメソッド呼び出し.function(arg1, arg2,arg3 );O-Cではこのようにすべきで、まず方法の申明です
?
View Code OBJC
1
-
(
void
)
function:
(
int
)
arg1 secondArg:
(
float
)
arg2 thirdArg:
(
NSString
*
)
arg3;
呼び出し時はこんな感じ
?
View Code OBJC
1
[
object function:
arg1 secondArg:
arg2 thirdArg:
arg3]
;
すなわち、メソッド名の後にパラメータのリストが直接表示されます.最初のパラメータには別名が必要ではありません.他のパラメータには別名が設定されている必要があります.O-Cはパラメータ別名を使用して呼び出されたパラメータを決定します.これにより、コンパイラはパラメータ間を1-Nのスペースで区切ることができます.