読み込み中...

Objective-C「performSelector:」の完全ガイド10選

Objective-CのperformSelector:メソッドを使ったプログラミング画面のイメージ Objctive-C
この記事は約15分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングの世界に足を踏み入れたばかりのあなたにとって、Objective-Cという言語は少々扱いが難しいものかもしれません。

しかし、その中でも特に便利な機能の一つが「performSelector:」です。

この機能を理解し、使いこなすことで、Objective-Cのプログラミングが格段に便利で強力なものに変わります。

本ガイドでは、performSelector:の概念から具体的な使用方法、注意点、さらにはカスタマイズの方法まで、初心者の方にもわかりやすく解説していきます。

この記事を読めば、あなたもperformSelector:を使ってObjective-Cのコードをより柔軟に、そして効率的に書けるようになります。

●Objective-Cとは

Objective-Cは、AppleのOSであるiOSやmacOSのアプリケーション開発に広く使用されているプログラミング言語です。

C言語をベースに、Smalltalk言語の影響を受けたオブジェクト指向の概念を取り入れて拡張されています。

Objective-Cでは、オブジェクト間のメッセージパッシングという形式で処理が行われ、このメッセージパッシングの機能を使うと、実行時にどのメソッドを呼び出すかを動的に決定することができます。この柔軟性がObjective-Cの強力な特徴の一つとなっています。

○Objective-Cの基本概念

Objective-Cを理解するためには、いくつかの基本的な概念を把握する必要があります。

まず、Objective-Cはオブジェクト指向言語ですので、クラス、インスタンス、メソッドなどのオブジェクト指向の基本的な要素を理解することが重要です。

クラスはオブジェクトの設計図であり、インスタンスはその設計図をもとに作成された具体的なオブジェクトです。

メソッドはオブジェクトが持つ機能、すなわち処理です。そして、performSelector:はメソッドの一つで、特定のセレクタ(メソッド名)を指定して、そのメソッドを実行するためのものです。

このperformSelector:を使うことで、プログラムの実行中に動的にメソッドを呼び出すことが可能になります。

●performSelector:の基本

Objective-CのperformSelector:は、プログラム実行中に特定のメッセージをオブジェクトに送信するためのメソッドです。

このメソッドを使うと、コンパイル時ではなく実行時にメソッドを選択して呼び出すことができるため、プログラムの柔軟性が高まります。

ただし、この強力な機能を適切に使うためには、Objective-Cのメッセージパッシングの理解が不可欠です。

○performSelector:の役割とは

performSelector:メソッドは、オブジェクトに対して動的にメソッドを呼び出す際に使用されます。

これにより、プログラムは実行時に決定される条件に基づいて、異なる動作をすることが可能になります。

例えば、ユーザーの入力や特定のイベント発生時に応じて、適切なメソッドを選択して実行するといったことがperformSelector:を用いることで実現できます。

○performSelector:の基本的な構文と使用法

Objective-CでperformSelector:を使う基本的な構文は次の通りです。

[オブジェクト performSelector:@selector(メソッド名)];

ここで、オブジェクトはメッセージを受け取るオブジェクト、@selector(メソッド名)は呼び出したいメソッドの名前を指定します。

セレクタは、メソッドの名前をコンパイラに知らせるObjective-Cの構文で、@selector()を使って表現されます。

この構文を使用する際の典型的な例は、特定の条件下でのメソッドの選択実行です。

例えば、アプリケーションにおいてユーザーの操作に応じて異なるアクションを起こす必要がある場合、複数のメソッドから適切なものを実行時に選択することができます。

●performSelector:の詳細な使い方

Objective-CのperformSelector:は、コードの柔軟性と再利用性を高めるために重要なメソッドです。

このメソッドを使うことで、実行時にオブジェクトが持つメソッドを選択し、呼び出すことができます。

ここでは、performSelector:を使ってメソッドを呼び出す際の具体的な手順と、その際に理解しておくべき詳細なポイントについて解説します。

○サンプルコード1:シンプルなメソッドの呼び出し

Objective-Cで最も基本的なperformSelector:の使用例は、単一のメソッドをオブジェクトに対して呼び出すことです。

下記のサンプルコードは、myObjectというインスタンスのsimpleMethodというメソッドを呼び出しています。

// MyClassのインスタンスを作成
MyClass *myObject = [[MyClass alloc] init];

// simpleMethodを実行
[myObject performSelector:@selector(simpleMethod)];

このコードではMyClassというクラスが定義されていると仮定し、simpleMethodは引数や戻り値を持たない単純なメソッドです。

このメソッドをperformSelector:を用いて呼び出すことで、動的にメソッドを実行することが可能になります。

○サンプルコード2:パラメータ付きメソッドの呼び出し

performSelector:は、引数を持つメソッドの呼び出しにも使用できます。

ただし、performSelector:には直接パラメータを渡すことはできません。

引数を一つだけ取るメソッドを呼び出す場合は、performSelector:withObject:を使用します。

// MyClassのインスタンスを作成
MyClass *myObject = [[MyClass alloc] init];

// withObjectParameterMethod:メソッドを引数"parameter"と共に実行
[myObject performSelector:@selector(withObjectParameterMethod:) withObject:@"parameter"];

このコード例では、withObjectParameterMethod:というメソッドが定義されていることを前提にしており、@"parameter"という文字列を引数としています。

performSelector:withObject:を使うことで、この引数をメソッドに渡して実行することができます。

○サンプルコード3:遅延実行のメソッドの呼び出し

メソッドを即時に実行するのではなく、遅延して実行したい場合もあります。

performSelector:withObject:afterDelay:を使えば、指定した遅延後にメソッドを実行することができます。

// MyClassのインスタンスを作成
MyClass *myObject = [[MyClass alloc] init];

// delayMethodを2秒後に実行
[myObject performSelector:@selector(delayMethod) withObject:nil afterDelay:2.0];

このコードでは、delayMethodというメソッドを2秒後に実行するようにスケジュールしています。

このようにperformSelector:withObject:afterDelay:メソッドを使用することで、指定したタイミングでのメソッド実行を計画することができるのです。

●performSelector:の応用例

Objective-CでperformSelector:のメソッドを応用することで、開発者は多様な状況に応じたプログラムを柔軟に作成できます。

ここではperformSelector:を使用した応用例として、複数のメソッドを順番に呼び出す方法、選択器を変数として扱う方法、バックグラウンドでメソッドを実行する方法、パフォーマンス測定に使用する方法の四つを紹介します。

○サンプルコード4:複数のメソッドを順番に呼び出す

ある処理を段階的に実行する必要がある場合、複数のメソッドを順に実行することが求められることがあります。

例えば、ユーザーからの入力を受け取った後、それを処理して結果を表示するまでの一連のメソッドを実行する場合です。

// MyClassのインスタンスを作成
MyClass *myObject = [[MyClass alloc] init];

// メソッドを順番に実行する
[myObject performSelector:@selector(firstMethod)];
[myObject performSelector:@selector(secondMethod)];
[myObject performSelector:@selector(thirdMethod)];

このコードでは、MyClassに定義されたfirstMethodsecondMethodthirdMethodを順に実行しています。

このようにperformSelector:を使ってメソッドを順番に実行することで、プログラムの流れを制御できます。

○サンプルコード5:選択器を変数として扱う

選択器(セレクタ)を変数として扱い、どのメソッドを実行するかを実行時に決定することができます。

この技法は、特にユーザーのアクションに応じて異なるメソッドを呼び出す必要がある場合に役立ちます。

// 選択器を変数として定義
SEL selectedMethod = @selector(specificMethod);

// 選択されたメソッドを実行
[myObject performSelector:selectedMethod];

この例では、specificMethodというメソッドを変数selectedMethodに代入し、それをperformSelector:に渡して実行しています。

これにより、どのメソッドを実行するかをプログラムの流れによって変更できるようになります。

○サンプルコード6:バックグラウンドでのメソッド実行

アプリケーションのレスポンスを高速化するためには、重い処理をバックグラウンドで行いたい場合があります。

Objective-Cでは、performSelectorInBackground:withObject:メソッドを使用して、バックグラウンドスレッドで処理を行うことができます。

// バックグラウンドでメソッドを実行
[myObject performSelectorInBackground:@selector(backgroundMethod) withObject:nil];

このコードでは、backgroundMethodをバックグラウンドスレッドで実行しており、これによりメインスレッドの処理を妨げることなくタスクを完了できます。

○サンプルコード7:パフォーマンス測定に使用する

パフォーマンスのボトルネックを特定するために、処理にかかる時間を計測することがあります。

performSelector:withObject:afterDelay:を使って、メソッド実行前後の時間を取得することで、実行時間を測定できます。

// 開始時刻を記録
NSDate *start = [NSDate date];

// メソッドを実行
[myObject performSelector:@selector(performanceMethod)];

// 実行後の時刻との差を計算して経過時間を表示
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:start];
NSLog(@"実行時間: %f 秒", executionTime);

このコードでは、performanceMethodの実行時間を計測してログに出力しています。

これにより、メソッドのパフォーマンス評価が可能になります。

●performSelector:の注意点

performSelector:メソッドを使う際には、いくつかの重要な注意点を理解しておく必要があります。

これらのポイントを正しく把握し、対応することで、エラーのリスクを減らし、アプリケーションの信頼性を高めることができます。

○エラーハンドリングの重要性

performSelector:を使用する際には、メソッドが存在しないかもしれないオブジェクトにメッセージを送る可能性があるため、適切なエラーハンドリングが不可欠です。

例えば、セレクタが実際にそのオブジェクトに実装されているかどうかを確認することは、実行時エラーを避ける基本的なステップです。

// MyClassのインスタンスを作成
MyClass *myObject = [[MyClass alloc] init];

// メソッドが存在するかどうかを確認する
if ([myObject respondsToSelector:@selector(methodThatMightNotExist:)]) {
    [myObject performSelector:@selector(methodThatMightNotExist:)];
} else {
    NSLog(@"エラー: methodThatMightNotExist: はこのオブジェクトには存在しません");
}

このコードでは、methodThatMightNotExist:メソッドがmyObjectインスタンスに実装されているかをrespondsToSelector:メソッドを使用してチェックしています。

これにより、メソッドが存在しない場合のクラッシュを防ぐことができます。

○メモリ管理の注意点

Objective-Cにおけるメモリ管理は、特にperformSelector:を用いる際に注意が必要です。

performSelector:によるメソッドの呼び出しは、ARC(Automatic Reference Counting)では管理されないため、廃棄されたオブジェクトにメッセージを送ってしまわないように、オブジェクトのライフサイクルを適切に管理する必要があります。

// myObjectが適切に解放されることを確認する
MyClass *myObject = [[MyClass alloc] init];
// ... myObjectを使った操作
myObject = nil; // myObjectを解放する

この例では、使用が終わったmyObjectのポインタをnilに設定しています。

これにより、ARCがオブジェクトをメモリから適切に解放できるようになります。

●performSelector:のカスタマイズ方法

Objective-CのperformSelector:メソッドは、カスタマイズしてさまざまな使い方をすることができます。

カスタマイズはプログラミングの柔軟性を高め、より複雑でダイナミックなアプリケーションを作成するのに役立ちます。

ここでは、カスタムセレクタの作成や拡張機能を利用した応用の例を挙げ、それぞれの方法を詳細に説明します。

○カスタマイズ例1:カスタムセレクタの作成

performSelector:を使用する際に、開発者が独自に定義したセレクタを実行することは一般的なカスタマイズの一つです。

下記の例は、カスタムセレクタを作成し、それをperformSelector:で呼び出す方法を表しています。

// MyClassにcustomActionメソッドが定義されていると仮定
SEL customSelector = @selector(customAction);

// customSelectorが実装されているか確認し、呼び出す
if ([myObject respondsToSelector:customSelector]) {
    [myObject performSelector:customSelector];
} else {
    NSLog(@"エラー: customActionはこのオブジェクトには存在しません");
}

このコードでは、customActionという新しいメソッドをMyClassに実装し、そのメソッドをカスタムセレクタとしてperformSelector:に渡しています。

respondsToSelector:を用いることで、セレクタの存在を確認後、安全にメソッドを呼び出しています。

○カスタマイズ例2:拡張機能を利用した応用

Objective-Cでは、カテゴリや拡張を使用してクラスの機能を拡張することができます。

これにより、元のクラスコードを変更することなく、新しいメソッドを追加できます。

下記の例では、カテゴリを使用して新しいメソッドを追加し、performSelector:を通じてこれらのメソッドを呼び出す方法を説明します。

// MyClassカテゴリのヘッダファイル (MyClass+CustomActions.h)
@interface MyClass (CustomActions)
- (void)customCategoryMethod;
@end

// カテゴリの実装ファイル (MyClass+CustomActions.m)
@implementation MyClass (CustomActions)
- (void)customCategoryMethod {
    NSLog(@"カテゴリから追加されたメソッドが実行されました");
}
@end

// カテゴリメソッドの使用
[myObject performSelector:@selector(customCategoryMethod)];

このコードスニペットでは、MyClassのカテゴリCustomActionsを定義し、customCategoryMethodという新しいメソッドを追加しています。

その後、performSelector:を使用して新しいカテゴリメソッドを呼び出しています。

カテゴリを使用すると、元のクラスを再コンパイルすることなく、必要に応じて新しい機能を追加することが可能です。

まとめ

この記事では、Objective-CのperformSelector:メソッドの基本から応用、さらにカスタマイズ方法までを詳しく解説しました。

performSelector:はObjective-Cの中でも特に強力なツールであり、その動的な性質を利用することで、プログラムに大きな柔軟性と拡張性をもたらすことができます。

ただし、その使用にはいくつかの注意点があります。エラーハンドリングの重要性、メモリ管理の注意点などを理解し、適切に対処することが重要です。

この記事が、皆さんのObjective-Cに対する理解を一層深め、効率的でパワフルなiOSやmacOSアプリケーションの開発に貢献する一助となれば幸いです。