Objective-Cのプライベートメソッド
@privateが使えるのはメンバ変数(インスタンス変数)のみ
プライベートなインスタンス変数は次のように宣言する事ができます。
//MyClass.h @interface MyClass : NSObject { @private id myInstanceVariable_; } // public methods - (id)myInstanceVariable; - (void)setMyInstanceVariable:(id)theVar; @end
ですが、privateなメソッドを記述する場合、.hファイルではなく.mファイルへ以下のように記述をします。
//MyClass.m @interface MyClass() -(void) privateMethod; @end @implemention MyClass // ここからヘッダーファイルに記述されている処理を実装する // privateMethodの実装もここにできる @end
つまり、プライベートメソッドに実装ファイル側の冒頭にinterface宣言と実装部をまとめて記述します。
Objective-C的にはこれはカテゴリーと呼ばれる機能です。
カテゴリーの補足説明
Perl寄りのHackerに向けて解説しておくと、
CPANモジュールにメソッド追加したい場合はそのモジュールを継承してからメソッドを追加する方法が一般的だと思います。
そんなときObjective-Cの場合は「親クラス+追加するメソッド名」をファイル名として既存クラスにメソッドを追加します。
以下、Twitter-OAuth-iPhoneで記述されている、NSStirngにURLEncodingの処理を追加したいのでカテゴリ機能を使って
機能を追加している例です。
// NSString+URLEncoding.h #import <Foundation/Foundation.h> @interface NSString (OAURLEncodingAdditions) - (NSString *)URLEncodedString; - (NSString *)URLDecodedString; @end
@implementation NSString (OAURLEncodingAdditions) - (NSString *)URLEncodedString { NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8); [result autorelease]; return result; } - (NSString*)URLDecodedString { NSString *result = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)self, CFSTR(""), kCFStringEncodingUTF8); [result autorelease]; return result; } @end
まとめ
Objective-Cではインスタンス変数をプライベート宣言する事はできるけど、メソッドをプライベートにする場合はカテゴリーをつかってね