objective-cノート5:カテゴリ
4078 ワード
1.カテゴリとは?
既存のクラスに新しいメソッドを追加します."category"
宣言カテゴリ:
実装カテゴリ:
呼び出し方法:
[dic setObject:[@"hello"lengthAsNumber] forKey:@"hello"];
2.カテゴリの限界:
第1:クラスに新しいインスタンス変数を追加できません.(グローバルディクショナリを使用して、オブジェクトと関連付けたい追加変数とのマッピングを格納できますが、sが現在のタスクを完了するための最適な選択かどうかも考慮してください)
第二に、名前が競合している.すなわち、カテゴリ内のメソッドが既存のメソッドと重複している.名前の競合が発生すると、カテゴリの優先度が高くなります.あなたのカテゴリメソッドは初期メソッドに完全に取って代わり、初期メソッドを使用することができなくなり、接頭辞を増やすのは良い選択です.
3.クラステーブルの利点(作用)
第一に、クラスの実現は複数の異なるものに分散できない.mファイルにあります.カテゴリの実装は、複数の異なるものに分散することができる.mファイルまたは複数の異なるフレームワーク.
eg:
@interface CategoryThing : NSObject{
実装:
CategoryThingの実装:
#import "CategoryThing.h"
thing 1の実装:
# import "CategoryThing.h"
thing 2,thing 3の実装はting 1に似ている.....
第二に、プライベートメソッドの順方向参照を作成します.
Cocoaに真のプライベートメソッドがない場合、プライベートメソッドの類似機能を実現する方法は、次のとおりです.
まずカテゴリにメソッドを宣言します.その後、既存のクラスのインプリメンテーションでこの方法を実装します.
これにより,このクラスの他のメソッドはこのメソッドを用いることができ,他の外部のクラスはそのメソッドの存在を知らない.
第三:オブジェクトに非公式プロトコルを追加する.
非公式プロトコルはNSObjectのカテゴリです.非公式プロトコルは、依頼を実現するために使用されます.
何がまた依頼なの?
委任(delegate)は、オブジェクトであり、別のクラスのオブジェクトが委任オブジェクトにいくつかの操作を実行するように要求します.たとえば、NSWindowクラスのオブジェクトは、自分の委任オブジェクトがウィンドウを閉じることを許可すべきかどうかを尋ねます.
依頼先のITunesFinderはどんな顔をしていますか?
ITunesFinderインタフェース:
@interface ITunesFinder : NSObject
@end//so easy?
@interfaceでメソッドを宣言する必要はありません.依頼オブジェクトになるには、すでに呼び出す予定のメソッドを実装する必要があります.
@implementation ITunesFinder
-(void) test1
{
.......
}
-(void) test2
{
.....
}
test 1とtest 2は依頼方法です.
委任とカテゴリの関係:
委任強調クラステーブルの別のアプリケーション:委任オブジェクトに送信されるメソッドは、NSObjectのカテゴリとして宣言できます.
応答セレクタ:
@selector(test1:)
委任オブジェクトが指定されたメッセージに応答できる場合は、そのオブジェクトにメッセージを送信します.そうしないと、委任オブジェクトは一時的に無視され、正常に動作します.
セレクタは渡され、メソッドのパラメータとして使用され、インスタンス変数として格納されます.
既存のクラスに新しいメソッドを追加します."category"
宣言カテゴリ:
@interface NSString (NumberConvenience)
- (NSNumber *) lengthAsNumber;
@end // NumberConvenience
実装カテゴリ:
@implementation NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
{
unsigned int length = [self length];
return ([Number numberWithUnsignedInt: length]);
}//lengthAsNumber
@end //NumberConvenience
呼び出し方法:
[dic setObject:[@"hello"lengthAsNumber] forKey:@"hello"];
2.カテゴリの限界:
第1:クラスに新しいインスタンス変数を追加できません.(グローバルディクショナリを使用して、オブジェクトと関連付けたい追加変数とのマッピングを格納できますが、sが現在のタスクを完了するための最適な選択かどうかも考慮してください)
第二に、名前が競合している.すなわち、カテゴリ内のメソッドが既存のメソッドと重複している.名前の競合が発生すると、カテゴリの優先度が高くなります.あなたのカテゴリメソッドは初期メソッドに完全に取って代わり、初期メソッドを使用することができなくなり、接頭辞を増やすのは良い選択です.
3.クラステーブルの利点(作用)
第一に、クラスの実現は複数の異なるものに分散できない.mファイルにあります.カテゴリの実装は、複数の異なるものに分散することができる.mファイルまたは複数の異なるフレームワーク.
eg:
@interface CategoryThing : NSObject{
int thing1;
int thing2;
int thing3;
}
@end //CategoryThing
//3
@interface CategoryThing (Thing1)
- (void) setThing1 :(int) thing1;
- (int) thing1;
@end // CategoryThing (Thing1)
@interface CategoryThing (Thing2)
- (void) setThing2 :(int) thing2;
- (int) thing2;
@end // CategoryThing (Thing2)
@interface CategoryThing (Thing3)
- (void) setThing3 :(int) thing3;
- (int) thing3;
@end // CategoryThing (Thing3)
実装:
CategoryThingの実装:
#import "CategoryThing.h"
@implementation CategoryThing
-(NSString *) description
{
NSString *desc;
desc = [NSString stringWithFormat: @"%d %d %d",
thing1,thing2,ting3];
return (desc);
}//description
@end //CategoryThing
thing 1の実装:
# import "CategoryThing.h"
@implementation CategoryThing (Thing1)
-(void) setThing1:(int) t1
{
thing1 = t1;
}//setTing1
-(int) thing1
{
return (thing1);
}// thing1
@end //CategoryThing(Thing1)
thing 2,thing 3の実装はting 1に似ている.....
第二に、プライベートメソッドの順方向参照を作成します.
Cocoaに真のプライベートメソッドがない場合、プライベートメソッドの類似機能を実現する方法は、次のとおりです.
まずカテゴリにメソッドを宣言します.その後、既存のクラスのインプリメンテーションでこの方法を実装します.
これにより,このクラスの他のメソッドはこのメソッドを用いることができ,他の外部のクラスはそのメソッドの存在を知らない.
第三:オブジェクトに非公式プロトコルを追加する.
非公式プロトコルはNSObjectのカテゴリです.非公式プロトコルは、依頼を実現するために使用されます.
何がまた依頼なの?
委任(delegate)は、オブジェクトであり、別のクラスのオブジェクトが委任オブジェクトにいくつかの操作を実行するように要求します.たとえば、NSWindowクラスのオブジェクトは、自分の委任オブジェクトがウィンドウを閉じることを許可すべきかどうかを尋ねます.
NSNetServiceBrowser *browser;
browser = [[NSNetServiceBrowser alloc] init];
ITunesFinder *finder;
finder = [[ITunesFinder alloc] init];
// finder
[browser setDelegate:finder];
[browser do someing...]
[browser release];
[finder release];//
依頼先のITunesFinderはどんな顔をしていますか?
ITunesFinderインタフェース:
@interface ITunesFinder : NSObject
@end//so easy?
@interfaceでメソッドを宣言する必要はありません.依頼オブジェクトになるには、すでに呼び出す予定のメソッドを実装する必要があります.
@implementation ITunesFinder
-(void) test1
{
.......
}
-(void) test2
{
.....
}
test 1とtest 2は依頼方法です.
委任とカテゴリの関係:
委任強調クラステーブルの別のアプリケーション:委任オブジェクトに送信されるメソッドは、NSObjectのカテゴリとして宣言できます.
応答セレクタ:
@selector(test1:)
委任オブジェクトが指定されたメッセージに応答できる場合は、そのオブジェクトにメッセージを送信します.そうしないと、委任オブジェクトは一時的に無視され、正常に動作します.
セレクタは渡され、メソッドのパラメータとして使用され、インスタンス変数として格納されます.