NSObject
継承:なし
フレームワーク:iOS 2.0 以降の Foundation。関連項目
概要(NSObject)
NSObject は、ほとんどの Objective-C のクラス階層のルートクラスです。NSObject を通じて、オブジェクト は、実行時システムに基本的なインターフェイスを継承し、Objective-C のオブジェクトとして動作するように能力を得ます。
タスク
クラスの初期化
+ initialize
最初のメッセージを受信する前にクラスを初期化します。
宣言
<< SWIFT >>
class func initialize() << OBJECTIVE-C >> + (void)initialize
議論
実行時は、クラス、またはそれから継承する全てのクラスは、プログラム内からの最初のメッセージを送信される直前にプログラム内の各クラスに initialize を送信します。実行時は、スレッドセーフな方法でクラスに initialize メッセージを送信します。スーパークラスは、それらのサブクラスの前にこのメッセージを受信します。サブクラスが initialize を実装していない場合は、スーパークラスの実装は、複数回呼び出されることがあり、実行時は、サブクラスは、明示的に [super initialize] を呼び出す場合には、継承した実装を呼び出します。あなたが複数回実行されている事から自分自身を守りたい場合は、これらのプログラムの行に沿って実装を構築できます。
- + (void)initialize {
- if (self == [ClassName self]) {
- // ... do the initialization ...
- }
- }
initialize はスレッドセーフな方法で呼び出され、異なるクラスに呼び出される、initialize の順序は保証されませんので、initialize のメソッドに必要な作業の最小量を行うことが重要です。具体的には、それらの initialize メソッド内の他のクラスによって必須とされる可能性があり、ロックを取る全てのコードはデッドロック(行き詰まり) につながるおそれがあります。そのため、複雑な初期化のための initialize に依存すべきではなく、その代わりに簡単な、クラスのローカルな初期化に制限する必要があります。
特別な考慮事項
initialize は一クラスにつき一度だけ呼び出されます。クラスだけ、クラスのカテゴリの独立した初期化を実行したい場合には、load メソッドを実装する必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
class(NSObject protocol)
+ load
クラスまたはカテゴリが Objective-C 実行環境に追加されるたびに呼び出されます。ロード時にクラス固有の動作を実行するには、このメソッドを実装します。
宣言
<< SWIFT >>
class func load() << OBJECTIVE-C >> + (void)load
議論
load メッセージは、動的にロードされ、かつ静的にリンクされているクラスとカテゴリに送信されますが、新たにロードされたクラスまたはカテゴリが、対応できるメソッドを実装している場合のみです。
初期化の順序は次のとおりです。
- あなたがリンクしているフレームワーク内の全ての初期化。
- あなたのイメージ内の全ての +load メソッド。
- C++ の全ての静的初期化と、あなたのイメージ内の C/C++ の __attribute__(constructor) 関数。
- あなたにリンクしているフレームワーク内の全ての初期化。
加えて:
- クラスの +load メソッドは、そのスーパークラスの +load のすべてのメソッドの後に呼び出されます。
- カテゴリの +load メソッドは、クラス自体の +load メソッドの後に呼び出されます。
load のカスタム実装では、したがって、同じイメージから他の無関係なクラスに安全にメッセージする事が出来ますが、これらのクラスによって実装された、load メソッドはまだ実行されていない可能性があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
オブジェクトの作成、コピー、そして割り当て解除
+ alloc
受信クラスの新しいインスタンスを返します。
宣言
<< OBJECTIVE-C >>
+ (instancetype)alloc
戻り値
受信者の新しいインスタンス。
議論
新しいインスタンスの isa インスタンス変数は、クラスを記述するデータ構造に初期化されます。他の全てのインスタンス変数のメモリは 0 に設定されます。
初期化プロセスを完了するため init... メソッドを使用しなければなりません。たとえば:
TheClass *newObject = [[TheClass alloc] init];
初期化コードを含むように alloc をオーバーライドしないでください。その代わり、init... メソッドのクラス固有のバージョンを実装して下さい。
歴史的な理由により、alloc は allocWithZone を呼び出します。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
+ allocWithZone:
受信クラスの新しいインスタンスを返します。
宣言
<< OBJECTIVE-C >>
+ (instancetype)allocWithZone:(struct _NSZone *)zone
パラメーター
zone | このパラメータは無視されます。 |
戻り値
受信者の新しいインスタンス。
議論
このメソッドは、歴史的な理由により存在します。メモリゾーンは、もはや Objective-C が使用しなくなっています。このメソッドをオーバーライドすべきではありません。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
– init 指名イニシャライザ
サブクラスにより実装され、メモリーが割り当てられた直後に新しいオブジェクト(受信者) を初期化します。
宣言
<< SWIFT >>
init << OBJECTIVE-C >> - (instancetype)init
戻り値
初期化されたオブジェクト、またはオブジェクトが例外をもたらさない何らかの理由で作成できなかった場合は nil。
議論
init メッセージはコードの同じ行に alloc(または allocWithZone:)メッセージと一緒になっています。
TheClass *newObject = [[TheClass alloc] init];
オブジェクトは、それが初期化されるまでは、使用できるように準備ができていません。NSObject クラスで定義された init メソッドは、初期化を行いません、それは単に self を返します。
このメソッドのカスタムの実装では、super の 指定イニシャライザ を呼び出し、その後初期化し、新しいオブジェクトを返す必要があります。新しいオブジェクトが初期化できない場合、メソッドは nil を返す必要があります。例えば、カメラのないデバイス上で実行された場合、仮にそれが BuiltInCamera クラスとすると、init メソッドから nil を返すことがあります。
- - (id)init {
- self = [super init];
- if (self) {
- // Initialize self.
- }
- return self;
- }
場合によっては、init メソッドは、置換オブジェクトを返す可能性があります。そのため、init によって返されたオブジェクトを常に使用しなければならず、alloc または allocWithZone: によって返されるオブジェクトは後続のコードで使ってはなりません。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
– copy
copyWithZone:で返されたオブジェクトを返します。
宣言
<< SWIFT >>
func copy() -> AnyObject << OBJECTIVE-C >> - (id)copy
戻り値
NSCopying プロトコルメソッドの copyWithZone: で返されるオブジェクト。
議論
これは NSCopying プロトコルを採用したクラスのコンビニエンス(便利な)メソッドです。copyWithZone: のための実装が存在しない場合、例外が発生します。
NSObject は、それ自体では NSCopying プロトコルをサポートしていません。サブクラスは、プロトコルをサポートし、copyWithZone: メソッドを実装しなければなりません。copyWithZone: メソッドのサブクラス版は、サブクラスが NSObject から直接下降しない限り、その実装を組み込むために、最初に super にメッセージを送信する必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
+ copyWithZone:
受信者(receiver) を返します。
宣言
<< OBJECTIVE-C >>
+(id)copyWithZone:(struct_NSZone *)zone
パラメータ
zone | この引数は無視されます。 |
戻り値
受信者。
議論
このメソッドは、そのクラスオブジェクトを使用すると、NSCopying プロトコルに準拠したオブジェクトを必要とする状況で使用できるよう存在します。たとえば、このメソッドでは、NSDictionary オブジェクトへのキーとしてクラスオブジェクトを使用できます。このメソッドをオーバーライドしないでください。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
– mutableCopy
mutableCopyWithZone: によって返されたオブジェクトを返します。
宣言
<< SWIFT >>
func mutableCopy() -> AnyObject << OBJECTIVE-C >> - (id)mutableCopy
戻り値
NSMutableCopying プロトコルメソッドの mutableCopyWithZone: によって返されるオブジェクト。
議論
これは NSMutableCopying プロトコルを採用したクラスのコンビニエンスメソッドです。 mutableCopyWithZone: の実装が存在しない場合、例外が発生します。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
+ mutableCopyWithZone:
受信者を返します。
宣言
<< OBJECTIVE-C >>
+ (id)mutableCopyWithZone:(struct_NSZone *)zone
パラメーター
zone | このパラメーターは無視されます。 |
戻り値
受信者。
議論
このメソッドは、NSMutableCopying プロトコルに準拠したオブジェクトを必要とする状況で、クラスオブジェクトが使用できるように存在します。たとえば、このメソッドでは、NSDictionary オブジェクトへのキーとしてクラスオブジェクトを使用できます。このメソッドをオーバーライドしないでください。Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
– dealloc
受信者が占有しているメモリの割り当てを解放します。
宣言
<< OBJECTIVE-C >>
- (void)dealloc
議論
受信者へのその後のメッセージは、メッセージが(解放済みメモリがまだ再利用されていない時に提供される) 割り当て解放済みオブジェクトに送信されたことを示すエラーを生成することがあります。
オブジェクトのインスタンス変数以外のリソースを破棄するためにこのメソッドをオーバーライドします。たとえば:
- - (void)dealloc {
- free(myBigBlockOfMemory);
- }
dealloc の実装では、スーパークラスの実装を呼び出してはいけません。dealloc を使用したファイル記述子などのような、限られたリソースの有効期間を管理するのは避けるべきです。
あなたは直接 dealloc メッセージを送信することは決してありません。その代わりに、オブジェクトの dealloc メソッドが実行時呼び出されます。詳細については、高度なメモリ管理プログラミングガイド を参照してください。
特別な考察
ARC を使用しない場合は dealloc の実装は、その最後の命令として、スーパークラスの実装を呼び出す必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
+ new
受信者クラスの新しいインスタンスを割り当て、それに init メッセージを送信し、初期化されたオブジェクトを返します。
宣言
<< OBJECTIVE-C >>
+ (instancetype)new
返り値
受信者の新しいインスタンス。
議論
このメソッドは、alloc と init を組み合わせた物です。alloc のように、これは新しいオブジェクトの isa インスタンス変数をクラスのデータ構造を指すように初期化します。その後、初期化プロセスを完了するために、init メソッドを呼び出します。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
クラスを識別
+ class
クラスオブジェクトを返します。
宣言
<< OBJECTIVE-C >>
+ (Class)class
戻り値
クラスオブジェクト。
議論
メッセージの受信者である場合に、その名前によってのみクラスを参照します。それ以外の場合は、クラスオブジェクトは、このメソッドまたは類似のメソッドにより取得されなければなりません。例えば、ここの SomeClass は isKindOfClass: メソッド(NSObject プロトコルで宣言された) に引数として渡されます。
BOOL test = [self isKindOfClass:[SomeClass class]];
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
class(NSObject プロトコル)
+ superclass
受信者のスーパークラスのクラスオブジェクトを返します。
宣言
<< SWIFT >>
class func superclass() -> AnyClass? << OBJECTIVE-C >> + (Class)superclass
戻り値
受信者のスーパークラスのクラスオブジェクト。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
superclass(NSObject プロトコル)
+ isSubclassOfClass:
受信クラスは、与えられたクラスと同一であるか、またはそのサブクラスであるかどうかを示すブール値を返します。
宣言
<< SWIFT >>
class func isSubclassOfClass(_ aClass: AnyClass) -> Bool << OBJECTIVE-C >> + (BOOL)isSubclassOfClass:(Class)aClass
パラメーター
aClass | クラスオブジェクト。 |
戻り値
もし受信クラスが aClass と同一か、またはそのサブクラスなら YES 、そうでなければ NO。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
クラスの機能をテストする
+ instancesRespondToSelector:
受信者のインスタンスが与えられたセレクタに応答することができるかどうかを示すブール値を返します。
宣言
<< SWIFT >>
class func instancesRespondToSelector(_ aSelector: Selector) ->> Bool << OBJECTIVE-C >> + (BOOL)instancesRespondToSelector:(SEL)aSelector
パラメーター
aSelector | セレクタ。 |
戻り値
受信者のインスタンスが、aSelector メッセージに応答できる場合には YES、そうでない場合は NO。
議論
aSelector メッセージを他のオブジェクトに転送している場合は、クラスのインスタンスは、このメソッドが NO を返したとしてもエラーなしでこれらのメッセージを受信できます。
むしろそのインスタンスではなく、代わりに、NSObject のプロトコルインスタンスメソッドの respondsToSelector: クラスに送信し、特定のメッセージに応答できるかどうかをクラスに尋ねます。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
プロトコル適合性のテスト
+ conformsToProtocol:
受信者が与えられたプロトコルに適合しているかどうかを示すブール値を返します。
宣言
<< SWIFT >>
class func conformsToProtocol(_ protocol: Protocol) -> Bool << OBJECTIVE-C >> + (BOOL)conformsToProtocol:(Protocol *)aProtocol
パラメーター
aProtocol | プロトコル。 |
戻り値
受信者が、aProtocol に適合しているなら YES そうでなければ NO。
議論
クラスは、プロトコルを採用しているか、それを採用している別のクラスから継承する場合、プロトコルに「適合している」と言われます。プロトコルは、インタフェース宣言の後に角括弧 内にリスト化されて採用されます。例えば、ここでは MyClass の(架空の) AffiliationRequests と Normalization プロトコルを採用しています:
@interface MyClass : NSObject <AffiliationRequests, Normalization>
クラスには、それが採用するプロトコルや継承に組み込まれているプロトコルにも適合しています。プロトコルは、クラスがそれらを採用するのと同じ方法で他のプロトコルを組み込んでいます。たとえば、ここでは AffiliationRequests プロトコルが Joining プロトコルを組み込んでいます。
@protocol AffiliationRequests <Joining>
クラスが別のプロトコルを組み込んだプロトコルを採用した場合、組み込まれたプロトコルのすべてのメソッドをまた実装するか、それを採用したクラスからそれらのメソッドを継承する必要があります。
上に示したように、このメソッドは、単にヘッダファイル内の正式な宣言に基づいて適合性を決定します。これは、プロトコルで宣言されているメソッドが実際に実装されているかどうかはチェックしませんーそれはプログラマの責任です。
このメソッドの引数として必要なプロトコルは、@protocol() ディレクティブを使用して指定することができます。
BOOL canJoin = [MyClass conformsToProtocol:@protocol(Joining)];
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
メソッドに関する情報を得る
– methodForSelector:
受信者の、メソッドの実装アドレスを、それを関数として呼び出すことができるように検索して返します。
宣言
<< SWIFT >>
func methodForSelector(_ aSelector: Selector) -> IMP << OBJECTIVE-C >> - (IMP)methodForSelector:(SEL)aSelector
パラメーター
aSelector | 実装のアドレスを返すためのメソッドを特定するセレクタ。セレクタは、有効で、かつ NULL でないものでなければなりません。不明な点がある場合は、methodForSelector: にセレクタを渡す前に、respondsToSelector: メソッドでチェックします。 |
戻り値
受信者の aSelector の実装アドレス。
議論
受信者がインスタンスである場合、aSelector はインスタンスメソッドを参照する必要があります。受信者がクラスである場合は、クラスメソッドを参照する必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
+ instanceMethodForSelector:
与えられたセレクタで識別されるインスタンスメソッドの実装アドレスを検索し、返します。
宣言
<< SWIFT >>
class func instanceMethodForSelector(_ aSelector: Selector) -> IMP << OBJECTIVE-C >> + (IMP)instanceMethodForSelector:(SEL)aSelector
パラメーター
aSelector | 実装アドレスを返すためのメソッドを特定する セレクタ。セレクタは、NULL 以外で、受信者に対して有効でなければなりません。不明な点がある場合は、methodForSelector にセレクタを渡す前にチェックするメソッド respondsToSelector: を使用します。 |
戻り値
aSelector インスタンスメソッドの実装アドレス。
議論
受信者のインスタンスが aSelector メッセージに応答できない場合、エラーが発生します。
インスタンスメソッドを実装したクラスオブジェクトを要求するためにのみ、このメソッドを使用して下さい。クラスに、クラスメソッドの実装のためのクラスを要求するには、代わりにクラスに methodForSelector: インスタンスメソッドを送ります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
+ instanceMethodSignatureForSelector:
与えられたセレクタで識別されるインスタンスメソッドの記述を含む NSMethodSignature オブジェクトを返します。
宣言
<< OBJECTIVE-C >>
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector
パラメーター
aSelector | 実装アドレスを返すためのメソッドを特定する セレクタ。 |
戻り値
aSelector で識別されるインスタンスメソッドの記述を含む NSMethodSignature オブジェクト、またはもしメソッドが見つからない場合は nil 。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
– methodSignatureForSelector:
与えられたセレクタで識別されるメソッドの記述を含む NSMethodSignature オブジェクトを返します。
宣言
<< OBJECTIVE-C >>
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
パラメーター
aSelector | 実装アドレスを返すためのメソッドを特定する セレクタ。受信者がインスタンスである場合には、aSelector はインスタンスメソッドを識別する必要があります。受信者がクラスである場合には、クラスメソッドを識別する必要があります。 |
戻り値
aSelector で識別されるメソッドの記述が含まれる NSMethodSignature オブジェクト、またはメソッドが見つからない場合は nil。
議論
このメソッドは、プロトコルの実装に使用されます。このメソッドはまた、メッセージの転送中などの時、NSInvocation オブジェクトが作成されなければならない状況においても使用されます。オブジェクトはデリゲートを保持したり、直接実装していないというメッセージを処理できる場合、適切なメソッドシグネチャを返すには、このメソッドをオーバーライドする必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
+ instanceMethodForSelector:- forwardInvocation:
オブジェクトの記述
+ description
受信クラスの内容を表す文字列を返します。
宣言
<< SWIFT >>
class func description() -> String << OBJECTIVE-C >> + (NSString *)description
戻り値
受信クラスの内容を表す文字列。
議論
デバッガの印刷-object コマンドは、オブジェクトのテキスト記述を生成するためにこのメソッドを呼び出します。
このメソッドの NSObject の実装は、単に、クラスの名前を出力します。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
description (NSObject プロトコル)
廃棄可能な内容のプロキシサポート
autoContentAccessingProxy プロパティ
受信オブジェクトのプロキシ。(読み取り専用)
宣言
<< SWIFT >>
var autoContentAccessingProxy: AnyObject { get } << OBJECTIVE-C >> @property(readonly, retain) id autoContentAccessingProxy
議論
このプロパティは、受信者が NSDiscardableContent プロトコルを採用しており、まだ破棄されていないコンテンツがある場合、受信オブジェクトのプロキシを返します。
プロキシはそれが生きている限り、コンテンツを利用可能に維持するために受信者に beginContentAccess を呼び出し、プロキシが割り当て解除されたときには endContentAccessを呼び出します。
そうでなければ、ラッパーオブジェクトは、NSProxy のサブクラスであり、NSProxy が行うように元の受信者オブジェクトにメッセージを転送します。
このメソッドは、同じメッセージに応答するが、作成されたプロキシが生きている限り利用できる元の受信者の内容を保持するオブジェクトを作成することによって、NSDiscardableContent オブジェクトの内容の揮発性を隠すために使用できます。このように隠された、NSDiscardableContent オブジェクトは(プロキシを経由して)、それ以外の場合は NSDiscardableContent オブジェクトの(各 NSDiscardableContent オブジェクトに特有な) beginContentAccess と endContentAccessを特定の使用法で呼出す必要があるオブジェクトだと知らず、それが疑いなくそのオブジェクトの受領者になるように分配されます。
利用可能
iOS 4.0 以降で利用できます。
メッセージの送信
– performSelector:withObject:afterDelay:
遅延の後、デフォルトモードを使用して、現在のスレッドで受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelector(_ aSelector: Selector, withObject anArgument: AnyObject?, afterDelay delay: NSTimeInterval) << OBJECTIVE-C >> - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
パラメーター
aSelector | 呼び出すメソッドを識別する セレクタ。メソッドは重要な戻り値を持つべきではなく、型 id の一つの引数、または引数なしであるべきです。 |
anArgument | それが呼び出されたときにメソッドに渡す引数。メソッドが引数をとらない場合は、nil を渡します。 |
delay | メッセージが送信される前の最小の時間。0 の遅延を指定しても、必然的にセレクタが直ちに実行されるわけではありません。セレクタは、まだスレッドの実行ループの待ち行列に入れられ、可能な限り早く実行されます。 |
議論
このメソッドは、現在のスレッドの実行ループ上に aSelector メッセージを実行するようにタイマーを設定します。タイマーは、デフォルトモード(NSDefaultRunLoopMode) で実行するように構成されています。タイマーが起動すると、スレッドは実行ループからメッセージを待ち行列から解放し、セレクタを実行しようとします。実行ループが実行されていて、デフォルトのモードになっている場合、それは成功で、そうでなければ、実行ループがデフォルトモードになるまで、タイマーは待っています。
実行ループがデフォルトモード以外のモードの時メッセージを待ち行列から解放するには、performSelector:withObject:afterDelay:inModes: メソッドを代わりに使って下さい。現在のスレッドがメインスレッドであるかどうかわからない場合は、performSelectorOnMainThread:withObject:waitUntilDone: か performSelectorOnMainThread:withObject:waitUntilDone:modes: メソッドを使用して、セレクタがメインスレッド上で実行されることを保証します。待ち行列に入れられたメッセージをキャンセルするには、cancelPreviousPerformRequestsWithTarget: メソッドか、 cancelPreviousPerformRequestsWithTarget:selector:object: を使用して下さい。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行するために定期的に実行される、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通コンテキストが至急の待ち行列によって起動されます。至急の待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
+ cancelPreviousPerformRequestsWithTarget:selector:object:– performSelectorOnMainThread:withObject:waitUntilDone:
– performSelectorOnMainThread:withObject:waitUntilDone:modes:
– performSelector:onThread:withObject:waitUntilDone:modes:
– performSelector:withObject:afterDelay:inModes:
遅延の後、指定されたモードを使用して、現在のスレッドで受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelector(_ aSelector: Selector, withObject anArgument: AnyObject?, afterDelay delay: NSTimeInterval, inModes modes: [String]) << OBJECTIVE-C >> - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSString *> *)modes
パラメーター
aSelector | 呼び出すメソッドを識別する セレクタ。メソッドは重要な戻り値を持つべきではなく、型 id の一つの引数、または引数なしであるべきです。 |
anArgument | それが呼び出されたときにメソッドに渡す引数。メソッドが引数をとらない場合、nil を渡します。 |
delay | メッセージが送信される前の最小の時間。0 の遅延を指定しても、必然的にセレクタが直ちに実行されるわけではありません。セレクタは、まだスレッドの実行ループ上に待ち行列に入れられ、可能な限り早く実行されます。 |
modes | セレクタを実行する、タイマーに関連したモードを識別する文字列の配列。この配列は、少なくとも一つの文字列が含まれていなければなりません。パラメーターに nil または空の配列を指定した場合、このメソッドは、指定されたセレクタを実行せずに返ります。実行ループモードの詳細については、スレッド·プログラミング·ガイド の実行ループ を参照してください。 |
議論
このメソッドは、現在のスレッドの実行ループ上で aSelector メッセージを実行するようにタイマーを設定します。タイマーは、modes パラメータで指定されたモードで実行するように構成されています。タイマーが起動すると、スレッドは実行ループからメッセージを待ち行列から解放し、セレクタを実行しようとします。実行ループが実行されていて、指定されたモードのいずれか一つにある場合、それは成功します。それ以外の場合、実行ループがこれらのモードのいずれかになるまで、タイマーは待機します。
実行ループがデフォルトモード以外のモードの時、メッセージを待ち行列から解放するには、 performSelector:withObject:afterDelay:inModes: メソッドを代わりに使って下さい。現在のスレッドがメインスレッドであるかどうかわからない場合は、performSelectorOnMainThread:withObject:waitUntilDone: か performSelectorOnMainThread:withObject:waitUntilDone:modes: メソッドを使用して、セレクタがメインスレッド上で実行することを保証します。待ち行列に入れられたメッセージをキャンセルするには、 cancelPreviousPerformRequestsWithTarget: メソッドか、 cancelPreviousPerformRequestsWithTarget:selector:object: を使用して下さい。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行するために定期的に実行される、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通のコンテキストが至急待ち行列によって起動されます。至急待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:withObject:afterDelay:
– performSelectorOnMainThread:withObject:waitUntilDone:
– performSelectorOnMainThread:withObject:waitUntilDone:modes:
– performSelector:onThread:withObject:waitUntilDone:modes:
addTimer:forMode: (NSRunLoop)
invalidate (NSTimer)
– performSelectorOnMainThread:withObject:waitUntilDone:
デフォルトモードを使用して、メインスレッド上で、受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelectorOnMainThread(_ aSelector: Selector, withObject arg: AnyObject?, waitUntilDone wait: Bool) << OBJECTIVE-C >> - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
パラメーター
aSelector | 呼び出すべきメソッドを識別する セレクタ。メソッドは重要な戻り値を持つべきではなく、型 id の一つの引数、または引数なしであるべきです。 |
arg | メソッドが呼び出されたときにそれに渡す引数。メソッドが引数をとらない場合は、nil を渡します。 |
wait | メインスレッド上で受信者が指定されたセレクタが実行された後になるまで現在のスレッドがブロックするかどうかを指定するブール値。このスレッドをブロックする場合は、YES を指定し、それ以外の場合は、すぐにこのメソッドが返るように NO を指定します。 現在のスレッドがまたメインスレッドであり、このパラメータに YES を指定すると、メッセージがすぐに配信され、処理されます。 |
議論
アプリケーションのメインスレッドにメッセージを配信するために、このメソッドを使用できます。メインスレッドは、アプリケーションのメイン実行ループを包含し、NSApplication オブジェクトがイベントを受け取る所です。この場合のメッセージは、スレッド上で実行しようとする現在のオブジェクトのメソッドです。
このメソッドは、モード、つまり NSRunLoopCommonModes 定数に関連するモードである、一般的な実行ループのモードを使用して、メインスレッドの実行ループでメッセージを待ち行列に入れます。その通常の実行ループ処理の一環として、メインスレッドはメッセージを(それが一般的な実行ループモードのいずれかで実行されていると仮定して) 待ち行列から取り出し、望みのメソッドを呼び出します。同じスレッドからこのメソッドを複数回呼び出すと、セレクタは待ち行列に入れられ、呼び出しが行われたのと全く同じ順序で実行されます。
特別な考察
このメソッドを使用して待ち行列に入れられたメッセージをキャンセルすることはできません。現在のスレッド上でメッセージをキャンセルするオプションが必要な場合は、performSelector:withObject:afterDelay: または performSelector:withObject:afterDelay:inModes: メソッドのどちらかを使用しなければなりません。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行するために定期的に実行される、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通のコンテキストが至急待ち行列によって起動されます。至急待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:withObject:afterDelay:– performSelector:withObject:afterDelay:inModes:
– performSelectorOnMainThread:withObject:waitUntilDone:modes:
– performSelector:onThread:withObject:waitUntilDone:modes:
– performSelectorOnMainThread:withObject:waitUntilDone:modes:
指定されたモードを使用してメインスレッド上で、受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelectorOnMainThread(_ aSelector: Selector, withObject arg: AnyObject?, waitUntilDone wait: Bool, modes array: [String]?) << OBJECTIVE-C >> - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray<NSString *> *)array
パラメーター
aSelector | 呼び出すべきメソッドを識別する セレクタ。このメソッドは重要な戻り値を持つべきではなく、型 id の一つの引数、または引数なしであるべきです。 |
arg | メソッドが呼び出されたときにそれに渡す引数。メソッドが引数をとらない場合は、nil を渡します。 |
wait | メインスレッド上の受信者が、指定されたセレクタが実行された後になるまで現在のスレッドがブロックするかどうかを指定するブール値。このスレッドをブロックする場合は、YES を指定し、それ以外の場合は、すぐにこのメソッドが返るように NO を指定します。 現在のスレッドがまたメインスレッドで、YES を渡すと、メッセージはすぐに実行され、そうでなければ実行ループを通じて次回に実行するように待ち行列に入れられます。 |
array | 指定されたセレクターを実行するために許容できるモードを識別する文字列の配列。この配列は、少なくとも一つの文字列を含んでいる必要があります。パラメーターに nil または空の配列を指定した場合、このメソッドは、指定されたセレクターを実行せずに返ります。実行ループのモードの詳細については、スレッド·プログラミング·ガイド の 実行ループ を参照してください。 |
議論
アプリケーションのメインスレッドにメッセージを配信するために、このメソッドを使用できます。メインスレッドは、アプリケーションのメイン実行ループを包含し、NSApplication オブジェクトがイベントを受け取る所です。この場合のメッセージは、スレッド上で実行したい現在のオブジェクトのメソッドです。
このメソッドは array パラメータで指定された実行ループモードを使用して、メインスレッドの実行ループ上でメッセージを待ち行列に入れます。その通常の実行ループ処理の一環として、メインスレッドはメッセージを(それが指定されたモードのいずれかで実行されていると仮定して) 待ち行列から取り出し、望みのメソッドを呼び出します。同じスレッドからこのメソッドを複数回呼び出した場合は、対応するセレクタが待ち行列に入れられるようにし、各セレクタのための関連実行ループモードが同じと仮定して、呼び出しが行われたのと全く同じ順序で実行されます。各セレクタで異なるモードを指定すると、その関連するモードのいずれかのセレクタが現在の実行ループモードと異なるモードを指定した場合、その後そのモードで実行ループが実行されるまで、現在の実行ループモードはスキップされます。
このメソッドを使用して待ち行列に入れられたメッセージをキャンセルすることはできません。現在のスレッドでメッセージをキャンセルするオプションが必要な場合は、performSelector:withObject:afterDelay: または performSelector:withObject:afterDelay:inModes: メソッドのどちらかを使用する必要があります。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行するために定期的に実行される、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通のコンテキストが至急待ち行列によって起動されます。至急待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:withObject:afterDelay:– performSelector:withObject:afterDelay:inModes:
– performSelectorOnMainThread:withObject:waitUntilDone:
– performSelectorOnMainThread:withObject:waitUntilDone:modes:
– performSelector:onThread:withObject:waitUntilDone:modes:
– performSelector:onThread:withObject:waitUntilDone:
デフォルトモードを使用して、指定されたスレッド上で、受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelector(_ aSelector: Selector, onThread thr: NSThread, withObject arg: AnyObject?, waitUntilDone wait: Bool) << OBJECTIVE-C >> - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait
パラメータ
aSelector | 呼び出すべきメソッドを特定する セレクタ。このメソッドは有意の戻り値を持つべきではなく、唯一 id 型の引数を取るか、または引数なしである必要があります。 |
thread | その上で aSelector を実行するスレッド。 |
arg | それが呼び出されたときにメソッドに渡すべき引数。メソッドが引数をとらない場合は、nil を渡します。 |
wait | 指定されたスレッド上で受信者に特定のセレクタが実行された後までに現在のスレッドをブロックするかどうかを指定するブール値。このスレッドをブロックする場合は、YES を指定し、それ以外の場合は、すぐにこのメソッドが戻るために NO を指定します。 現在のスレッドとターゲットスレッドが同じであり、このパラメータに YES を指定すると、セレクタは、現在のスレッド上ですぐに実行されます。NO を指定した場合、このメソッドは、他のスレッドの場合とちょうど同じように、スレッドの実行ループと返り値にメッセージを待ち行列に入れます。現在のスレッドは、その後待ち行列から取り出され、そうする機会を持っているときにメッセージを処理する必要があります。 |
議論
アプリケーション内の他のスレッドにメッセージを配信するために、このメソッドを使用できます。この場合のメッセージは、ターゲットスレッドで実行しようとする現在のオブジェクトのメソッドです。
このメソッドは、デフォルトの実行ループーつまり、NSRunLoopCommonModes 定数に伴うモードである、実行ループモードを使い、ターゲットスレッドの実行ループにメッセージを待ち行列に入れます。その通常の実行ループ処理の一部として、ターゲットスレッドは、(それがデフォルトの実行ループモードのいずれか一つで実行されていると仮定して) メッセージを待ち行列から取り出し、望みのメソッドを呼び出します。
このメソッドを使用して、待ち行列に入れられたメッセージをキャンセルすることはできません。現在のスレッドでメッセージをキャンセルするオプションが必要な場合は、performSelector:withObject:afterDelay: か、 performSelector:withObject:afterDelay:inModes: メソッドのどちらかを使用する必要があります。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行され定期的に実行されるために、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通のコンテキストが至急待ち行列によって起動されます。至急待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:onThread:withObject:waitUntilDone:modes:
– performSelectorInBackground:withObject:
– performSelector:onThread:withObject:waitUntilDone:modes:
指定されたモードを使用して、指定されたスレッド上で、受信者のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelector(_ aSelector: Selector, onThread thr: NSThread, withObject arg: AnyObject?, waitUntilDone wait: Bool, modes array: [String]?) << OBJECTIVE-C >> - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray<NSString *> *)array
パラメーター
aSelector | 呼び出すべきメソッドを識別する セレクタ。これは、重要な戻り値を持つべきではなく、型 id の引数を一つ、または引数なしであるべきです。 |
thread | その上で aSelector を実行するスレッド。このスレッドは、ターゲットスレッドを表しています。 |
arg | メソッドが呼び出されたときにそれに渡すべき引数。メソッドが引数をとらない場合は、nil を渡します。 |
wait | 指定されたセレクタが指定されたスレッド上で、受信者上で実行された後になるまで現在のスレッドがブロックするかどうかを指定するブール値。このスレッドをブロックする場合は、YES を指定し、それ以外の場合、すぐにこのメソッドが戻るように NO を指定します。 現在のスレッドとターゲットスレッドが同じであり、このパラメータに YES を指定すると、セレクタは直ちに実行されます。NO を指定した場合、このスレッドが同じか違うかはは関係なく、このメソッドはメッセージを待ち行列に入れ、すぐに返します。 |
array | 指定されたセレクタを実行するために許容できるモードを識別する文字列の配列。この配列には、少なくとも一つの文字列を含んでいる必要があります。パラメーターに nil または空の配列を指定した場合、このメソッドは、指定されたセレクタを実行せずに返します。実行ループのモードの詳細については、スレッド·プログラミング·ガイド の 実行ループ を参照してください。 |
議論
アプリケーション内の他のスレッドにメッセージを配信するために、このメソッドを使用できます。この場合のメッセージは、ターゲットスレッド上で実行したい現在のオブジェクトのメソッドです。
このメソッドは array パラメータで指定された実行ループモードを使用して、ターゲットスレッドの実行ループ上でメッセージを待ち行列に入れます。その通常の実行ループ処理の一部として、ターゲットスレッドは、(それが指定されたモードのいずれか一つで実行されていると仮定して) メッセージを待ち行列から取り出し、望みのメソッドを呼び出します。
このメソッドを使用して待ち行列に入れられたメッセージをキャンセルすることはできません。現在のスレッド上のメッセージをキャンセルするオプションが必要な場合は、代わりに performSelector:withObject:afterDelay: か、performSelector:withObject:afterDelay:inModes: メソッドのどちらかを使用する必要があります。
特別な考察
このメソッドは、現在のコンテキストの実行ループに登録して、正しく実行するために定期的に実行される、その実行ループに依存します。このメソッドを呼び出し、自動的に定期的に実行されていない実行ループに登録し終えるかもしれない一つの共通のコンテキストが至急待ち行列によって起動されます。至急待ち行列上で実行しているときにこの種の機能が必要な場合は、必要な動作を得るために dispatch_after および関連するメソッドを使用する必要があります。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:onThread:withObject:waitUntilDone:
– performSelectorInBackground:withObject:
– performSelectorInBackground:withObject:
新しいバックグラウンドスレッドで受信機のメソッドを呼び出します。
宣言
<< SWIFT >>
func performSelectorInBackground(_ aSelector: Selector, withObject arg: AnyObject?) << OBJECTIVE-C >> - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
パラメーター
aSelector | 呼び出すべきメソッドを識別する セレクタ。このメソッドは重要な戻り値を持つべきではなく、型 id の一つの引数、または引数なしであるべきです。 |
arg | メソッドが呼び出されたときにそれに渡すべき引数。メソッドが引数をとらない場合は、nil を渡します。 |
議論
このメソッドは、アプリケーションがすでに準備できていなかった場合には、マルチスレッドモードにそれを入れ、アプリケーション内に新しいスレッドを作成します。aSelector で表わされるメソッドはちょうどあなたのプログラム内の他の新しいスレッドの場合と同じようにスレッド環境をセットアップする必要があります。スレッドを構成し、実行するのに必要な詳細については、スレッドのプログラミングガイド を参照してください。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– performSelector:onThread:withObject:waitUntilDone:modes:+ cancelPreviousPerformRequestsWithTarget:
performSelector:withObject:afterDelay: インスタンス·メソッドで以前登録された遂行要求をキャンセルします。
宣言
<< SWIFT >>
class func cancelPreviousPerformRequestsWithTarget(_ aTarget: AnyObject) << OBJECTIVE-C >> + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget
パラメーター
aTarget | 以前 performSelector:withObject:afterDelay: インスタンス·メソッドで登録した要求のターゲット。 |
議論
同じターゲット aTarget を持つ全ての遂行要求はキャンセルされます。このメソッドは、すべての実行ループではなく、現在の実行ループでのみ遂行要求を削除します。
利用可能
iOS 2.0 以降で利用できます。
+ cancelPreviousPerformRequestsWithTarget:selector:object:
performSelector:withObject:afterDelay: で以前登録された遂行要求をキャンセルします。
宣言
<< SWIFT >>
class func cancelPreviousPerformRequestsWithTarget(_ aTarget: AnyObject, selector aSelector: Selector, object anArgument: AnyObject?) << OBJECTIVE-C >> + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
パラメーター
aTarget | 以前 performSelector:withObject:afterDelay: インスタンス·メソッドで登録した要求のターゲット。 |
aSelector | 以前 performSelector:withObject:afterDelay: インスタンス·メソッドで登録した要求の セレクタ。 |
anArgument | 以前 performSelector:withObject:afterDelay: インスタンス·メソッドで登録した引数。引数が等しい事は IsEqual: を使用して決定されますので、値は元々渡されたものと同じオブジェクトである必要はありません。元々引数として渡された nil の要求に合うように nil を渡します。 |
議論
aTarget と同じターゲット、anArgument と同じ引数、および aSelector と同じセレクタを持っているすべての遂行要求が、キャンセルされます。このメソッドは、すべての実行ループではなく、現在の実行ループでのみ遂行要求を削除します。
利用可能
iOS 2.0 以降で利用できます。
メッセージの転送
– forwardingTargetForSelector:
認識されていないメッセージが最初に向けられる先のオブジェクトを返します。
宣言
<< SWIFT >>
func forwardingTargetForSelector(_ aSelector: Selector) -> AnyObject? << OBJECTIVE-C >> - (id)forwardingTargetForSelector:(SEL)aSelector
パラメーター
aSelector | 受信者が実装していないメソッドの セレクタ。 |
戻り値
認識されていないメッセージが最初に向けられる先のオブジェクト。
議論
オブジェクトがこのメソッドを実装(または継承)、およびオブジェクトが新しい受信者オブジェクトとメッセージの急送として使用されて返される、nil でない結果(また self でない) 結果を返す場合、その新しいオブジェクトに再開されます。(このメソッドから self を返した場合、明らかにコードは無限ループにすぐ陥いるでしょう。)
ルートクラスでないクラスでこのメソッドを実装する場合、クラスが与えられたセレクタに返す物が何もなかった場合、super の実装を呼び出した結果を返す必要があります。
このメソッドは、オブジェクトを、はるかに高価な forwardInvocation: の手続きが引き次ぐ前に、送られて来た未知のメッセージをリダイレクトする機会を与えます。これは、単に別のオブジェクトにメッセージをリダイレクトし、通常の転送よりも桁違いに早くすることができ、便利です。転送の目的が NSInvocation をキャプチャし、または転送中に引数や戻り値を操作する時には、有用ではありません。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
– forwardInvocation:
他のオブジェクトにメッセージを転送するためにサブクラスによってオーバーライドされます。
宣言
<< OBJECTIVE-C >>
- (void)forwardInvocation:(NSInvocation *)anInvocation
パラメーター
anInvocation | 転送するべき呼び出し。 |
議論
オブジェクトは、それが対応するメソッドを持たないため、メッセージを送信されると、実行時システムは、別の受信者にメッセージをデリゲートする機会を受信者に与えます。メッセージを表す NSInvocation オブジェクトを作成して、受信者に引数として NSInvocation オブジェクトを含む forwardInvocation: メッセージを送信することにより、メッセージをデリゲートします。それから受信者の forwardInvocation: メソッドは、別のオブジェクトにメッセージを転送するのを選択できます。(そのオブジェクトもメッセージのいずれにも応答できない場合、それにも転送する機会が与えられます。)
forwardInvocation: メッセージは、このように、オブジェクトが、特定のメッセージのために、その代わりに動作し、他のオブジェクトとの関係を確立することをできるようにします。転送オブジェクトは、ある意味で、それがメッセージを転送するオブジェクトの特性のいくつかを"継承" することができます。
重要:オブジェクト自身が認識しないメソッドに応答するには、forwardInvocation に加えて、methodSignatureForSelector: をオーバーライドしなければなりません。メッセージ転送のためのメカニズムは methodSignatureForSelector: から得られた情報を使用して、NSInvocation オブジェクトを転送するために作成します。オーバーライドメソッドは与えられたセレクタに適切なメソッドシグネチャを提供しなければならず、事前に策定したり、別のオブジェクトに訊ねたりします。
forwardInvocation メソッドの実装には、2つのタスクがあります:
- anInvocation でエンコードされたメッセージに応答できるオブジェクトを検索します。このオブジェクトは、すべてのメッセージで同じである必要はありません。
- anInvocation を使用して、そのオブジェクトにメッセージを送信します。anInvocation は結果を保持し、実行時システムは、元の送信者にこの結果を抽出して届けます。
単純なケースでは、オブジェクトがメッセージを、ただ1つの宛先(例えば、以下の例の架空の friend インスタンス変数のように) に転送する時に、forwardInvocation: メソッドは、このように単純になります:
- - (void)forwardInvocation:(NSInvocation *)invocation
- {
- SEL aSelector = [invocation selector];
- if ([friend respondsToSelector:aSelector])
- [invocation invokeWithTarget:friend];
- else
- [super forwardInvocation:invocation];
- }
転送されるメッセージは、引数の数が固定されていなければなりません。引数の変数番号(printf()のスタイルで) はサポートされていません。
転送されたメッセージの戻り値は、元の送信者に戻されます。戻り値すべての型は送信者に配信できます:id 型、構造体、倍精度浮動小数点数。
forwardInvocation: メソッドの実装は、単にメッセージを転送するよりも多くを行えます。forwardInvocation: は、例えば、各セレクタに別々のメソッドを記述することの必要性を回避し、様々に異なるメッセージに応答するコードを統合するために使用できます。forwardInvocation: メソッドはまた、その一つへ転送するのではなく、与えられたメッセージに応答する他のいくつかのオブジェクトを含む場合があります。
forwardInvocation: の NSObject の実装は、単に doesNotRecognizeSelector: メソッドを呼び出します。それはいかなるメッセージも転送しません。forwardInvocation: を実装しないことを選択した場合は、このようにオブジェクトに認識されていないメッセージを送信すると、例外が発生します。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC;
使用可能:
iOS 2.0 以降で利用できます。
メソッドの動的な解決
+ resolveClassMethod:
クラスメソッドで与えられたセレクタの実装を動的に提供します。
宣言
<< SWIFT >>
class func resolveClassMethod(_ sel: Selector) -> Bool << OBJECTIVE-C >> + (BOOL)resolveClassMethod:(SEL)name
パラメーター
name | 解決するべき、セレクタの名前。 |
戻り値
メソッドが発見され、受信者に追加された場合は YES そうでなければ NO。
議論
このメソッドでは、与えられたセレクタの実装を動的に提供できます。さらなる議論のためには、 resolveInstanceMethod: を参照してください。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
+ resolveInstanceMethod:
インスタンスメソッドの、与えられたセレクタの実装を動的に提供します。
宣言
<< SWIFT >>
class func resolveInstanceMethod(_ sel: Selector) -> Bool << OBJECTIVE-C >> + (BOOL)resolveInstanceMethod:(SEL)name
パラメーター
name | 解決するべき、セレクタの名前。 |
戻り値
メソッドが発見され、受信者に追加された場合は YES そうでなければ NO。
議論
このメソッドと resolveClassMethod: は、与えられたセレクタの実装を動的に提供できます。
Objective-C のメソッドは、少なくとも 2 つの引数- self と _cmd を取る単なる C の関数です。class_addMethod 関数を使用すると、メソッドとしてクラスに関数を追加できます。以下の関数があるとします:
- void dynamicMethodIMP(id self, SEL _cmd)
- {
- // implementation ....
- }
以下のように、クラスをメソッド(resolveThisMethodDynamically と呼ばれる) として動的に追加できるように、resolveInstanceMethod: を使用できます。
- + (BOOL) resolveInstanceMethod:(SEL)aSEL
- {
- if (aSEL == @selector(resolveThisMethodDynamically))
- {
- class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
- return YES;
- }
- return [super resolveInstanceMethod:aSel];
- }
特別な考察
Objective-C の転送メカニズムが呼び出される前にこのメソッドが呼び出されます。respondsToSelector: や instancesRespondToSelector: が呼び出された場合、動的メソッドの解決は、最初に与えられたセレクタのため IMP を提供する機会が与えられます。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
エラー処理
– doesNotRecognizeSelector:
受信者が認識しないメッセージを処理します。
宣言
<< SWIFT >>
func doesNotRecognizeSelector(_ aSelector: Selector) << OBJECTIVE-C >> - (void)doesNotRecognizeSelector:(SEL)aSelector
パラメーター
aSelector | 受信者によって実装または認識されないメソッドを識別する セレクタ。 |
議論
オブジェクトが、それに応答したり転送できない aSelector メッセージを受信するたびに、実行時のシステムは、このメソッドを呼び出します。このメソッドは、順番に、NSInvalidArgumentException の例外を発生し、エラーメッセージを生成します。
どんな doesNotRecognizeSelector: メッセージでも、一般的に実行時システムによってのみ送信されます。しかし、それらはメソッドを継承される事から防止するために、プログラムコード内で使うことができます。例えば、doesNotRecognizeSelector: メッセージを含むように再実装することで、NSObject のサブクラスは、copy や init メソッドを以下のように、放棄する可能性があります。
- - (id)copy
- {
- [self doesNotRecognizeSelector:_cmd];
- }
_cmd 変数は、現在のセレクタである、すべてのメソッドに渡される隠し引数であり、この例では、copy メソッドのセレクタを識別しています。このコードは、copy 転送からのメッセージやスーパークラスを copy するために応答する事からサブクラスのインスタンスを防ぎますが、respondsToSelector: は、受信者が copy メソッドへのアクセス権を持っている事をまだ報告します。
このメソッドをオーバーライドする場合には、super を呼び出すか、実装の最後に NSInvalidArgumentException の例外を発生させる必要があります。つまり、このメソッドは正常に返りません、それには常に例外が投げられている必要があります。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
アーカイブ
– awakeAfterUsingCoder:
復号化され、その後、このメッセージを受け取ったオブジェクトの代わりに別のオブジェクトを代行するサブクラスによってオーバーライドされます。
宣言
<< SWIFT >>
func awakeAfterUsingCoder(_ aDecoder: NSCoder) -> AnyObject? << OBJECTIVE-C >> - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
パラメーター
aDecoder | 受信者を復号化するために使用するデコーダ。 |
戻り値
復号化され、その後、このメッセージを受け取ったオブジェクトの代わりの受信者、または別のオブジェクト。
議論
コーダによって作成された冗長なオブジェクトを排除するために、このメソッドを使用できます。例えば、オブジェクトを復号した後に、同等のオブジェクトが既に存在していることを発見した場合、既存のオブジェクトを返すことができます。代替者が返された場合は、あなたのオーバーライドメソッドは受信者を解放する責任があります。
このメソッドは、NSCoder によって呼び出されます。NSObject の実装は、単に self を返します。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
initWithCoder:(NSCodingプロトコル)
classForCoder プロパティ
コード化中に、それ自身以外のクラスを代替するためにサブクラスによってオーバーライドされます。
宣言
<< SWIFT >>
var classForCoder: AnyClass { get } << OBJECTIVE-C >> @property(readonly) Class classForCoder
議論
このメソッドは、NSCoder によって呼び出されます。NSObject の実装は、受信者のクラスを返します。クラス・クラスタのプライベート・サブクラスは、アーカイブされる時に、パブリック・スーパークラスの名前を置き換えます。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
classForKeyedArchiver プロパティ
鍵付きのアーカイブ時にインスタンスの新しいクラスを置き換えるためのサブクラス。
宣言
<< SWIFT >>
var classForKeyedArchiver: AnyClass? { get } << OBJECTIVE-C >> @property(readonly) Class classForKeyedArchiver
議論
クラスのメンバーであるかのようにオブジェクトはコード化されます。このプロパティは、エンコーダクラスによりオーバーライドされ、クラスのコード化テーブルによりインスタンス名にオーバーライドされます。このプロパティが nil の場合、このプロパティの結果は無視されます。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– replacementObjectForKeyedArchiver:
+ classFallbacksForKeyedArchiver
そのクラスが利用できない場合、オブジェクトを復号するために使用できるクラスの名前を返すようにオーバーライドされます。
宣言
<< SWIFT >>
class func classFallbacksForKeyedArchiver() -> [String] << OBJECTIVE-C >> + (NSArray<NSString *> *)classFallbacksForKeyedArchiver
戻り値
アンアーカイビングの優先順にクラスの名前を指定する NSString オブジェクトの配列
議論
NSKeyedArchiver は、このメソッドを呼び出して、アーカイブ内にその結果を格納します。オブジェクトの実際のクラスがアンアーカイビングの時に存在しない場合は、 NSKeyedUnarchiver は、クラスの格納されたリストを通過しており、オブジェクトを復号化するための代替クラスとして存在している最初のものを使用します。このメソッドのデフォルトの実装は nil を返します。
アーカイブは、そのクラスを持っていないシステムに読み込まれる場合、いくつかの下位互換性を提供するために、アプリケーションに新しいクラスを導入している場合は、このメソッドを使用できます。時々、新しいクラスの代用としてのように動作できる、別のクラスがあり、新しいクラスのアーカイブキーとアーカイブされた状態とを慎重に選択し(または互換性を書き出して)、オブジェクトは必要があれば代用クラスとしてアンアーカイブされます。
利用可能
iOS 2.0 以降で利用できます。
+ classForKeyedUnarchiver
鍵付きのアンアーカイブ中に新しいクラスを代用するためにサブクラスによってオーバーライドされます。
宣言
<< SWIFT >>
class func classForKeyedUnarchiver() -> AnyClass << OBJECTIVE-C >> + (Class)classForKeyedUnarchiver
戻り値
鍵付きのアンアーカイブ中に受信者を代用するクラス。
議論
鍵付きのアンアーカイブ中に、受信者のインスタンスが返されたクラスのメンバーとして復号されます。このメソッドは、クラスコード化テーブルへとデコーダのクラスとインスタンスの名前の結果をオーバーライドします。
利用可能
iOS 2.0 以降で利用できます。
– replacementObjectForCoder:
コード化中に自分自身のために他のオブジェクトを代用するためにサブクラスによってオーバーライドされます。
宣言
<< SWIFT >>
func replacementObjectForCoder(_ aCoder: NSCoder) -> AnyObject? << OBJECTIVE-C >> - (id)replacementObjectForCoder:(NSCoder *)aCoder
パラメーター
aCoder | 受信者をコード化するコーダ。 |
戻り値
受信者の代わりに、オブジェクトがコード化します(異なる場合)。
議論
オブジェクトがアーカイブに自分自身をコード化するかもしれませんが、配布用にコード化されている場合、自分自身のためにプロキシをコード化します。このメソッドは、NSCoder によって呼び出されます。 NSObject の実装は、self を返します。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– classForCoder– awakeAfterUsingCoder:
– replacementObjectForKeyedArchiver:
鍵付きのアーカイブ中に自分自身のために他のオブジェクトを代用するためにサブクラスによってオーバーライドされます。
宣言
<< SWIFT >>
func replacementObjectForKeyedArchiver(_ archiver: NSKeyedArchiver) -> AnyObject? << OBJECTIVE-C >> - (id)replacementObjectForKeyedArchiver:(NSKeyedArchiver *)archiver
パラメーター
archiver | アーカイブを作成する鍵付きアーカイバ。 |
戻り値
受信者の代わりに、オブジェクトがコード化します(異なる場合)。
議論
オブジェクト用の交換用のマッピングが、エンコーダで設定されていない場合にのみ、このメソッドは呼び出されます(例えば、replacementObjectForKeyedArchiver の、そのオブジェクトへの前の呼び出しのため)。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
– classForKeyedArchiver+ setVersion:
受信者のバージョン番号を設定します。
宣言
<< SWIFT >>
class func setVersion(_ aVersion: Int) << OBJECTIVE-C >> + (void)setVersion:(NSInteger)aVersion
パラメーター
aVersion | 受信者のバージョン番号。 |
議論
クラスのインスタンスをアーカイブし、後で再利用する場合にバージョン番号が役立ちます。デフォルトのバージョンは 0 です。
特別な考察
バージョン番号は NSArchiver/NSUnarchiver に適用されますが、NSKeyedArchiver/NSKeyedUnarchiver には適用されません。鍵付きアーカイバは、クラスのバージョン番号をコード化しません。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
+ version
クラスに割り当てられたバージョン番号を返します。
宣言
<< SWIFT >>
class func version() -> Int << OBJECTIVE-C >> + (NSInteger)version
戻り値
クラスに割り当てられたバージョン番号。
議論
バージョンが設定されていない場合、デフォルトは 0 です。
バージョン番号は、オブジェクトの古いバージョンを検出し、正しく復号化できるために、復号化又はアンアーカイブのために必要とされます。
NSCoding プロトコルまたは他のメソッドの中からバージョンを取得するときには注意すべきです。クラスのバージョン番号を取得するときには、明示的にクラス名を使用します。
version = [MyClass version];
単にクラスの戻り値に version を送信しないでください-代わりにサブクラスのバージョン番号が返されるかもしれません。
特別な考察
バージョン番号は NSArchiver/NSUnarchiver に適用されますが、NSKeyedArchiver/NSKeyedUnarchiver には適用されません。鍵付きアーカイバは、クラスのバージョン番号をコード化しません。
利用可能
iOS 2.0 以降で利用できます。
以下も見よ
VersionForClassName: (NSCoder)
旧式のメソッド
– finalize
ガベージコレクタは、使用するメモリを廃棄する前に、受信者に対してこのメソッドを呼び出します。
ガベージコレクションは、OS X v10.8 で旧式となりました。代わりに、自動参照カウントを使用する必要があります。ARC への移行のリリースノート を参照の事。
宣言
<< SWIFT >>
func finalize() << OBJECTIVE-C >> - (void)finalize
議論
ガベージコレクタは、使用するメモリを廃棄する前に、受信者に対してこのメソッドを呼び出します。ガベージコレクションが有効になっている場合、このメソッドは dealloc の代わりにに呼び出されます。
以下の例に示すように、受信者が獲得したリソースを放棄するために、このメソッドをオーバーライドできます。
- - (void)finalize {
- if (log_file != NULL) {
- fclose(log_file);
- log_file = NULL;
- }
- [super finalize];
- }
しかし、典型的には、もし可能ならすべてファイナライズする前にリソースを放棄することをお勧めします。詳細については、finalize メソッドの実装を参照してください。
特別な考慮事項
新規または既存のライブオブジェクトの中に self を保存するとエラーになります(口語的に"復活" とも呼ばれます) が、これはこのメソッドが一度だけ呼び出されることを意味します。しかし、受信者は現時点でファイナライズされている他のオブジェクトのファイナライズ後にメッセージが送られるので、あなたのオーバーライドは例に示した log_file = NULL 文によって、再利用されたリソースの将来の使用を防ぐ必要があります。finalize メソッド自体は、与えられたオブジェクトに対して複数回呼び出されることは決してありません。
重要:finalize メソッドは、スレッドセーフでなければなりません。
Import 文
<< OBJECTIVE-C >>
@import ObjectiveC; << SWIFT >> import ObjectiveC
使用可能:
iOS 2.0 以降で利用できます。
以下も見よ
次の章