OC構文クイックスタート
6941 ワード
ソース:https://www.runoob.com/w3cnote/objective-c-tutorial.html
定義セクションでは、クラスの名前、データ・メンバー、メソッドを明確に定義します.キーワード@interfaceで始まり、@endで終わります.
メソッドの前の+/-番号は関数のタイプを表します:プラス記号(+)はクラスメソッド(class method)を表し、インスタンスを必要とせずに呼び出すことができ、C++の静的関数(static member function)と似ています.マイナス記号(-)は、一般的なインスタンスメソッド(instance method)です.
ここでは、以下のように意味の近いC++構文対照を提供します.
Objective-Cが新しいメソッドを定義する場合、名前内のコロン(:)はパラメータ伝達を表し、C言語とは異なり数学関数の括弧でパラメータを伝達する.Objective-Cメソッドは、パラメータを名前の間に混在させることができ、メソッド名の末尾にすべてアタッチする必要がなく、プログラムの可読性を向上させることができる.色RGBの値を設定する方法を例にとります.
このメソッドの署名はsetColorToRed:Green:Blue:です.各コロンの後ろにはfloatカテゴリのパラメータがあり、赤、緑、青の3色を表しています.
Object-Cには、メソッド、クラスメソッド、インスタンスメソッドの2種類があります.
クラスメソッドは+で始まり、その基本形式は以下の通りです.
クラスメソッドは一般的にファクトリメソッドであり、インスタンスを返します.
≪インスタンス・メソッド|Instance Method|Hsf≫は、次のような基本形式で開始します.
メソッドは、パラメータを持たなくてもよいし、1つ以上のパラメータを持っていてもよいし、戻り値を持っていてもよい.
1、プログラムのヘッダファイルとソースファイルの拡張子はそれぞれ.h和.m;
2、注釈:一方通行(//)と複数行(/*......*/);
3、Object_CのnilはNULLに相当します.
4、Object_CのYESとNOはtrueとfalseに相当する.
5、#importは#includeに相当し、インポートヘッダファイルにも2つの検索方法<...>と「...」がありますが、#importは同じファイルが複数回インポートされることを自動的に防止します.
6、Object_CのすべてのクラスはNSObjectから継承する必要があります.
7、Object_Cは単一の親継承のみをサポートし、多重継承はサポートしません.
8、Object_Cのすべてのオブジェクトはポインタの形式です.
9、Object_Cはthisの代わりにselfを使用します.
10、Object_C void*の代わりにidを使用します.
11、Object_Cではクラスをメッセージで表す方法として,[aInstance method:argv]呼び出し形式を用いる.
12、Object_Cは反射機構をサポートする.
13、Object_Cは、Dynamic Typing、Dynamic Binding、およびDynamic Loadingをサポートします.
実装ブロックには、公開メソッドの実装、およびプライベート変数およびメソッドの定義が含まれる.キーワード@implementationをブロックとして始め,@endで終わる.
プロパティは、アクセスメソッドを宣言する代わりに便利です.プロパティは、クラス宣言に新しいインスタンス変数を作成しません.メソッドが既存のインスタンス変数にアクセスする速記方式を定義するだけです.インスタンス変数を露出するクラスでは、getter構文やsetter構文の代わりに属性記号を使用できます.クラスはまた、プロパティを使用して、インスタンス変数に確実に保存されるのではなく、一部のデータの動的計算の結果である「仮想」インスタンス変数を暴露することもできます.
実際には、属性が書かなければならない余分なコードを大幅に節約していると言えます.ほとんどのアクセスメソッドは同様の方法で実装されるため、属性はクラスが露出する各インスタンス変数に異なるgetterおよびsetterを提供する必要を回避する.代わりに、属性宣言で希望する動作を指定し、コンパイル中に宣言に基づく実際のgetterメソッドとsetterメソッドを合成します.
属性宣言はクラスインタフェースのメソッド宣言に置くべきです.基本的な定義は@propertyコンパイルオプションを使用して、タイプ情報と属性の名前に続いています.また、カスタムオプションを使用してプロパティを構成することもできます.これにより、アクセス方法の動作が決定されます.次の例では、簡単なプロパティ宣言を示します.
性のアクセスメソッドは@synthesizeキーワードによって実現され、属性の宣言によって自動的に一対のアクセスメソッドが生成されます.また、@dynamicキーワードを使用して、アクセス方法がプログラマによって手動で提供されることを示すこともできます.
プロパティは、従来のメッセージ式、ポイント式、または「valueForKey:」/「setValue:forKey:」メソッドペアを使用してアクセスできます.
ポイント式を使用してインスタンスのプロパティにアクセスするには、selfキーを使用します.
クラスまたはプロトコルのプロパティは、動的に読み取ることができます.
複数の属性の間でカンマで区切ることができます.
readonlyとreadwrite:
readonlyは、このプロパティが読み取り専用であり、外部では値を変更できないことを示します.readonlyに対する修飾はreadwriteですが、デフォルトなので書く必要はありません.atomicとnonatomic:
(atomic、nonatomic)プロパティはマルチスレッドプログラミングに使用され、プロパティのデフォルトはatomicです.マルチスレッド環境でatomicに設定すると、データの読み取りの一貫性が保証されます(これは、データが1つのスレッドによってのみ独占されることを保証します.つまり、1つのスレッドが書き込みを行う場合、その属性がロックされ、他のスレッドが書き込みを許可されないためです).この操作はデータをロックするため、多くのリソースを消費します.したがって、マルチスレッド操作を必要としない場合は、このプロパティをnonatomicに設定することをお勧めします.このパラメータに設定すると、プログラムはいずれの場合もプロパティをロックしません.
strongとweak:
strongはデフォルトです.strongは、このプロパティが対応するオブジェクトに対して強い参照であることを示します.1つの変数は、変数が他のオブジェクトまたはnilに割り当てられるまで、その役割ドメインの範囲内にあるか、またはそれが他のオブジェクトまたはnilに与えられるまで、1つのオブジェクトへの強い参照を維持します.Weakは、プロパティに対応するオブジェクトへの弱い参照を表します.
copy、assign、retain:
copy修飾は、作成した新しいオブジェクトを保持する必要があるため、この属性が強い参照を使用することを示します.
assignはsetterメソッドを簡単な値で指定し、インデックスカウント(Reference Counting)を変更せず、一般的に簡単なデータ型にassignを使用します.
retain、オブジェクト参照カウントに1を加算します.
Objective-C 2.0は、NSEnumeratorオブジェクトまたはコレクション内で順次列挙するよりも、迅速な列挙の構文を提供します.Objective-C 2.0では、以下のサイクルの機能は等しいが、性能特性は異なる.
高速列挙は、列挙によって呼び出される方法がNSFastEnumerationプロトコルによって提供されるポインタ演算によって置き換えられるため、標準列挙よりも効率的なコードを生成することができる.
他にもカテゴリがありますが、転送は後で勉強しても大丈夫です.
Interface
定義セクションでは、クラスの名前、データ・メンバー、メソッドを明確に定義します.キーワード@interfaceで始まり、@endで終わります.
@interface MyObject : NSObject {
int memberVar1; //
id memberVar2;
}
+(return_type) class_method; //
-(return_type) instance_method1; //
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
メソッドの前の+/-番号は関数のタイプを表します:プラス記号(+)はクラスメソッド(class method)を表し、インスタンスを必要とせずに呼び出すことができ、C++の静的関数(static member function)と似ています.マイナス記号(-)は、一般的なインスタンスメソッド(instance method)です.
ここでは、以下のように意味の近いC++構文対照を提供します.
class MyObject : public NSObject {
protected:
int memberVar1; //
void * memberVar2;
public:
static return_type class_method(); //
return_type instance_method1(); //
return_type instance_method2( int p1 );
return_type instance_method3( int p1, int p2 );
}
Objective-Cが新しいメソッドを定義する場合、名前内のコロン(:)はパラメータ伝達を表し、C言語とは異なり数学関数の括弧でパラメータを伝達する.Objective-Cメソッドは、パラメータを名前の間に混在させることができ、メソッド名の末尾にすべてアタッチする必要がなく、プログラムの可読性を向上させることができる.色RGBの値を設定する方法を例にとります.
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* */
[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* */
このメソッドの署名はsetColorToRed:Green:Blue:です.各コロンの後ろにはfloatカテゴリのパラメータがあり、赤、緑、青の3色を表しています.
Object-Cには、メソッド、クラスメソッド、インスタンスメソッドの2種類があります.
クラスメソッドは+で始まり、その基本形式は以下の通りです.
(id)someMethod;
クラスメソッドは一般的にファクトリメソッドであり、インスタンスを返します.
≪インスタンス・メソッド|Instance Method|Hsf≫は、次のような基本形式で開始します.
- (void)someMethod;
メソッドは、パラメータを持たなくてもよいし、1つ以上のパラメータを持っていてもよいし、戻り値を持っていてもよい.
(int)someMethod;
(void)someMethodWithValue:(SomeType)value;
(void)someMethodWithFirstValue:(SomeType)value1 secondValue:(AnotherType)value2;
1、プログラムのヘッダファイルとソースファイルの拡張子はそれぞれ.h和.m;
2、注釈:一方通行(//)と複数行(/*......*/);
3、Object_CのnilはNULLに相当します.
4、Object_CのYESとNOはtrueとfalseに相当する.
5、#importは#includeに相当し、インポートヘッダファイルにも2つの検索方法<...>と「...」がありますが、#importは同じファイルが複数回インポートされることを自動的に防止します.
6、Object_CのすべてのクラスはNSObjectから継承する必要があります.
7、Object_Cは単一の親継承のみをサポートし、多重継承はサポートしません.
8、Object_Cのすべてのオブジェクトはポインタの形式です.
9、Object_Cはthisの代わりにselfを使用します.
10、Object_C void*の代わりにidを使用します.
11、Object_Cではクラスをメッセージで表す方法として,[aInstance method:argv]呼び出し形式を用いる.
12、Object_Cは反射機構をサポートする.
13、Object_Cは、Dynamic Typing、Dynamic Binding、およびDynamic Loadingをサポートします.
Implementation
実装ブロックには、公開メソッドの実装、およびプライベート変数およびメソッドの定義が含まれる.キーワード@implementationをブロックとして始め,@endで終わる.
@implementation MyObject {
int memberVar3; //
}
+(return_type) class_method {
.... //method implementation
}
-(return_type) instance_method1 {
....
}
-(return_type) instance_method2: (int) p1 {
....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
....
}
@end
ツールバーの
プロパティは、アクセスメソッドを宣言する代わりに便利です.プロパティは、クラス宣言に新しいインスタンス変数を作成しません.メソッドが既存のインスタンス変数にアクセスする速記方式を定義するだけです.インスタンス変数を露出するクラスでは、getter構文やsetter構文の代わりに属性記号を使用できます.クラスはまた、プロパティを使用して、インスタンス変数に確実に保存されるのではなく、一部のデータの動的計算の結果である「仮想」インスタンス変数を暴露することもできます.
実際には、属性が書かなければならない余分なコードを大幅に節約していると言えます.ほとんどのアクセスメソッドは同様の方法で実装されるため、属性はクラスが露出する各インスタンス変数に異なるgetterおよびsetterを提供する必要を回避する.代わりに、属性宣言で希望する動作を指定し、コンパイル中に宣言に基づく実際のgetterメソッドとsetterメソッドを合成します.
属性宣言はクラスインタフェースのメソッド宣言に置くべきです.基本的な定義は@propertyコンパイルオプションを使用して、タイプ情報と属性の名前に続いています.また、カスタムオプションを使用してプロパティを構成することもできます.これにより、アクセス方法の動作が決定されます.次の例では、簡単なプロパティ宣言を示します.
@interface Person : NSObject {
@public
NSString *name;
@private
int age;
}
@property(copy) NSString *name;
@property(readonly) int age;
-(id)initWithAge:(int)age;
@end
性のアクセスメソッドは@synthesizeキーワードによって実現され、属性の宣言によって自動的に一対のアクセスメソッドが生成されます.また、@dynamicキーワードを使用して、アクセス方法がプログラマによって手動で提供されることを示すこともできます.
@implementation Person
@synthesize name;
@dynamic age;
-(id)initWithAge:(int)initAge
{
age = initAge; // : ,
return self;
}
-(int)age
{
return 29; // :
}
@end
プロパティは、従来のメッセージ式、ポイント式、または「valueForKey:」/「setValue:forKey:」メソッドペアを使用してアクセスできます.
Person *aPerson = [[Person alloc] initWithAge: 53];
aPerson.name = @"Steve"; // : , [aPerson setName: @"Steve"];
NSLog(@"Access by message (%@), dot notation(%@), property name(%@) and direct instance variable access (%@)",
[aPerson name], aPerson.name, [aPerson valueForKey:@"name"], aPerson->name);
ポイント式を使用してインスタンスのプロパティにアクセスするには、selfキーを使用します.
-(void) introduceMyselfWithProperties:(BOOL)useGetter
{
NSLog(@"Hi, my name is %@.", (useGetter ? self.name : name)); // NOTE: getter vs. ivar access
}
クラスまたはプロトコルのプロパティは、動的に読み取ることができます.
複数の属性の間でカンマで区切ることができます.
@property (strong, nonatomic) UIWindow *window;
プロパティには、通常、データのアクセスや格納などを制御するためにいくつかの修飾が加えられます.@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
属性修飾:
readonlyとreadwrite:
readonlyは、このプロパティが読み取り専用であり、外部では値を変更できないことを示します.readonlyに対する修飾はreadwriteですが、デフォルトなので書く必要はありません.atomicとnonatomic:
(atomic、nonatomic)プロパティはマルチスレッドプログラミングに使用され、プロパティのデフォルトはatomicです.マルチスレッド環境でatomicに設定すると、データの読み取りの一貫性が保証されます(これは、データが1つのスレッドによってのみ独占されることを保証します.つまり、1つのスレッドが書き込みを行う場合、その属性がロックされ、他のスレッドが書き込みを許可されないためです).この操作はデータをロックするため、多くのリソースを消費します.したがって、マルチスレッド操作を必要としない場合は、このプロパティをnonatomicに設定することをお勧めします.このパラメータに設定すると、プログラムはいずれの場合もプロパティをロックしません.
strongとweak:
strongはデフォルトです.strongは、このプロパティが対応するオブジェクトに対して強い参照であることを示します.1つの変数は、変数が他のオブジェクトまたはnilに割り当てられるまで、その役割ドメインの範囲内にあるか、またはそれが他のオブジェクトまたはnilに与えられるまで、1つのオブジェクトへの強い参照を維持します.Weakは、プロパティに対応するオブジェクトへの弱い参照を表します.
copy、assign、retain:
copy修飾は、作成した新しいオブジェクトを保持する必要があるため、この属性が強い参照を使用することを示します.
assignはsetterメソッドを簡単な値で指定し、インデックスカウント(Reference Counting)を変更せず、一般的に簡単なデータ型にassignを使用します.
retain、オブジェクト参照カウントに1を加算します.
クイック列挙
Objective-C 2.0は、NSEnumeratorオブジェクトまたはコレクション内で順次列挙するよりも、迅速な列挙の構文を提供します.Objective-C 2.0では、以下のサイクルの機能は等しいが、性能特性は異なる.
// NSEnumerator
NSEnumerator *enumerator = [thePeople objectEnumerator];
Person *p;
while ( (p = [enumerator nextObject]) != nil ) {
NSLog(@"%@ is %i years old.", [p name], [p age]);
}
//
for ( int i = 0; i < [thePeople count]; i++ ) {
Person *p = [thePeople objectAtIndex:i];
NSLog(@"%@ is %i years old.", [p name], [p age]);
}
//
for (Person *p in thePeople) {
NSLog(@"%@ is %i years old.", [p name], [p age]);
}
高速列挙は、列挙によって呼び出される方法がNSFastEnumerationプロトコルによって提供されるポインタ演算によって置き換えられるため、標準列挙よりも効率的なコードを生成することができる.
他にもカテゴリがありますが、転送は後で勉強しても大丈夫です.