Objective-C Language
基本データ型
サーチ…
構文
- BOOL havePlutonium = YES; //直接のアサイメント
- BOOL fastEnough =(car.speedInMPH> = 88); //比較式
- BOOL fluxCapacitorActive =(havePluutonium && fastEnough); //ブール式
- id somethingWicked = [witchesCupboard lastObject]; //型指定されていないオブジェクトを取得する
- イドパウダー= prepareWickedIngredient(somethingWicked); //渡して返します
- if([components isKindOfClass:[Toad class]]){//テスト実行時の型
BOOL
BOOL
型はObjective-Cのブール値に使用されます。より一般的な「真」および「偽」とは対照的に、 YES
とNO
2つの値があります。
その動作はC言語のものと単純で同一です。
BOOL areEqual = (1 == 1); // areEqual is YES
BOOL areNotEqual = !areEqual // areNotEqual is NO
NSCAssert(areEqual, "Mathematics is a lie"); // Assertion passes
BOOL shouldFlatterReader = YES;
if (shouldFlatterReader) {
NSLog(@"Only the very smartest programmers read this kind of material.");
}
BOOL
はプリミティブなので、Foundationコレクションに直接格納することはできません。それはNSNumber
でラップする必要があります。 Clangはこれに対して特別な構文を提供します:
NSNumber * yes = @YES; // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO; // Equivalent to [NSNumber numberWithBool:NO]
BOOL
実装は、C99に直接基づいています。これは、C99標準型bool
typedefです。 YES
とNO
値はそれぞれ__objc_yes
と__objc_no
定義されています。これらの特別な値は、 (BOOL)1
および(BOOL)0
変換される、Clangによって導入されたコンパイラ組み込み関数です。使用できない場合は、 YES
とNO
が直接キャスト整数型として定義されます。定義はObjective-Cランタイムヘッダーobjc.hにあります
id
id
は汎用オブジェクトポインタであり、 "任意のオブジェクト"を表すObjective-C型です。 Objective-Cクラスのインスタンスは、 id
変数に格納できます。 id
と他のクラスの型は、キャストせずに前後に割り当てることができます:
id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];
これは、コレクションからオブジェクトを取得する場合に関係します。以下のようなメソッドの戻り値の型objectAtIndex:
あるid
、まさにこの理由のために。
DataRecord * record = [records objectAtIndex:anIndex];
また、 id
として型指定されたメソッドまたは関数のパラメータは、任意のオブジェクトを受け入れることができます。
オブジェクトをid
として型指定すると、既知のメッセージを渡すことができます。メソッドのディスパッチはコンパイル時の型に依存しません。
NSString * extinctBirdMaybe =
[anonymousSurname stringByAppendingString:anonymousSurname];
オブジェクトが実際に応答しないというメッセージは、実行時にも例外を引き起こします。
NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception
例外に対する保護。
NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
nope = [anonymousSurname addTimeInterval:10];
}
id
型はobjc.hで定義されています
typedef struct objc_object {
Class isa;
} *id;
SEL
セレクタは、Objective-Cのメソッド識別子として使用されます。
以下の例では、2つのセレクタがあります。 new
とsetName:
Person* customer = [Person new];
[customer setName:@"John Doe"];
角括弧の各ペアはメッセージ送信に対応します。最初の行では、 new
セレクタを含むメッセージをPerson
クラスに送信し、2行目ではsetName:
セレクタと文字列を含むメッセージを送信します。これらのメッセージの受信者はセレクタを使用して、実行する正しいアクションをルックアップします。
ほとんどの場合、ブラケットシンタックスを使用したメッセージの渡しは十分ですが、時にはセレクタ自体を操作する必要があることもあります。このような場合、 SEL
タイプを使用してセレクタへの参照を保持することができます。
セレクタがコンパイル時に利用可能な場合は、 @selector()
を使用してそのセレクタへの参照を取得できます。
SEL s = @selector(setName:);
実行時にセレクタを見つける必要がある場合は、NSSelectorFromStringを使用します。
SEL s NSSelectorFromString(@"setName:");
NSSelectorFromStringを使用する場合は、セレクタ名をNSStringにラップするようにしてください。
デリゲートがオプションのメソッドを実装しているかどうかを確認するためによく使用されます。
if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
[self.myDelegate doSomething];
}
IMP(インプリメンテーションポインタ)
IMPは、実装ポインタとも呼ばれるメソッドの実装を参照するC型です。これは、メソッド実装の開始を指すポインタです。
構文:
id (*IMP)(id, SEL, …)
IMPは次のように定義されます。
typedef id (*IMP)(id self,SEL _cmd,…);
このIMPにアクセスするには、メッセージ"methodForSelector"を使用できます。
例1:
IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];
IMPによってアドレッシングされたメソッドは、IMPの逆参照によって呼び出すことができます。
ImpDoSomething(myObject, @selector(doSomething));
したがって、これらの呼び出しは等しいです。
myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];
例:2:
SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");
IMP methodImplementation = [self methodForSelector:otherWaySelector];
result = methodImplementation( self,
betterWaySelector,
first,
second,
third );
NSLog(@"methodForSelector : %@", result);
ここでは、メソッドを実際に実装するC関数へのポインタを返す[NSObject methodForSelector]を呼び出します。これは、後で直接呼び出すことができます。
NSIntegerおよびNSUInteger
NSIntegerは、アーキテクチャーに応じてint型とlong型の単なるtypedefです。同じことが、符号なしバリアントのtypedefであるNSUIntegerにも当てはまります。 NSIntegerをチェックすると、次のように表示されます:
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
符号付きint型またはlong型の違いは、符号付きintまたはlongに負の値を含めることができることです。 intの範囲は-2 147 483 648〜2 147 483 647で、unsigned intの範囲は0〜4 294 967 295です。値が負であると言うために最初のビットがもう使用されないため、値は2倍になりますか否か。 64ビットアーキテクチャーで長いNSIntegerの場合、その範囲ははるかに広いです。
Appleが提供するほとんどのメソッドは、通常のintよりNS(U)Integerを返しています。 64ビットアーキテクチャで実行している場合、精度を失うため、通常のintにキャストしようとすると警告が表示されます。ほとんどの場合重要ではありませんが、NS(U)Integerを使用する方が簡単です。たとえば、配列のcountメソッドはNSUIntegerを返します。
NSNumber *iAmNumber = @0;
NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];
NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.
BOOLと同じように、NS(U)Integerは基本データ型なので、NSNumberにラップする必要がある場合があります。整数の前に@を使用すると、上記のようにキャストし、以下のメソッドを使用して取得できます。しかし、それをNSNumberにキャストするには、次のメソッドを使用することもできます。
[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];