NSObjectプロトコル

2010. 11. 08
●概要

NSObjectプロトコルのグループメソッドは、全てのObjective-Cオブジェクトの基礎です。

オブジェクトがこのプロトコルに準拠している場合、ファーストクラスオブジェクトと見なすことができます。

このようなオブジェクトは以下のような問い合わせをすることができます。

・クラスと継承階層内のクラスの位置
・プロトコルへの準拠
・特定のメッセージに応答する能力

また(retainreleaseautoreleaseメソッドを伴う)このプロトコルに準拠するオブジェクトは、Foundationで定義されているオブジェクトの管理と解放の仕組みをまとめることができます。
(詳細については『Advanced Memory Management Programming Guide(日本語版は『高度なメモリ管理プログラミングガイド』)』を参照してください)

したがって、NSObjectプロトコルに準拠しているオブジェクトは、NSArrayNSDictionaryで定義されているようなコンテナオブジェクトとして管理することができます。

CocoaルートクラスとNSObjectはこのプロトコルを採用しているので、NSObjectから継承されている全てのオブジェクトはこのプロトコルで記述された表現を持っています。



●タスク

●クラスの識別

– class    required method
– superclass    required method

●オブジェクトの識別と比較

– isEqual:    required method
– hash    required method
– self    required method

●参照カウントの管理

– retain    required method
– release    required method
– autorelease    required method
– retainCount    required method

●オブジェクトの継承、動作、適合のテスト

– isKindOfClass:    required method
– isMemberOfClass:    required method
– respondsToSelector:    required method
– conformsToProtocol:    required method

●オブジェクトの記述

– description    required method

●メッセージの送信

– performSelector:    required method
– performSelector:withObject:    required method
– performSelector:withObject:withObject:    required method

●割り当て領域の決定

– zone    required method

●プロキシの識別

– isProxy    required method



●インスタンスメソッド

autorelease

- (id)autorelease

現在の自動解放プールにレシーバを追加します。(必須)

戻り値はselfです。

自動解放プールにオブジェクトを追加するとreleaseメッセージを受信し、プールが破棄された時に解放されます。

自動解放の仕組みについての詳細は『Advanced Memory Management Programming Guide(日本語版は『高度なメモリ管理プログラミングガイド』)』を参照してください。

特別な考慮事項

ガベージコレクションが有効な場合、このメソッドは何もしません。


isKindOfClass:

- (BOOL)isKindOfClass:(Class)aClass

レシーバが指定したクラスのインスタンスか、またはそのクラスを継承した任意のクラスのインスタンスかを示すブール値を返します。(必須)

戻り値は、レシーバがaClassのインスタンスまたはaClassを継承した任意のクラスのインスタンスであればYESを、それ以外はNOを返します。

例えば次のコードの場合、FoundationのNSCorderから継承したNSArchiverクラスは isKindOfClass:はYESを返します。

NSMutableData *myData = [NSMutableData dataWithCapacity:30];
id anArchiver = [[NSArchiver alloc] initForWritingWithMutableData:myData];
if ( [anArchiver isKindOfClass:[NSCoder class]] )
    ...

クラスクラスタで表されているオブジェクトでこのメソッドを使用する場合は注意してください。

クラスクラスタの特性上、返すオブジェクトが常に想定している型とは限りません。

このメソッドを呼び出してクラスクラスタを返す場合、メソッドによって返される正確な型でそのオブジェクトが何を実行するかを示すのが最良です。

例えば、以下のように可変配列に対してメソッドがNSArrayオブジェクトのポインタを返す場合、このメソッドを使用しないでください。

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]]) {
    // Modify the object
}

コード内でこのような構成で使用した場合、オブジェクトの変更なら大丈夫だと思われるかもしれませんが、実際には変更してはいけません。

他のコードで変更しないオブジェクトと想定していた場合、問題が発生する場合があります。

レシーバがクラスオブジェクトの場合、aClassと同じ型のクラスオブジェクトであればこのメソッドはYESを返し、それ以外はNOを返します。

aClass:テストするObjective-Cのクラスを表すクラスオブジェクトを指定します。


isMemberOfClass:

- (BOOL)isMemberOfClass:(Class)aClass

レシーバが指定したクラスのインスタンスかどうかを示すブール値を返します。(必須)

戻り値は、レシーバがaClassのインスタンスである場合はYES、それ以外の場合はNOを返します。

例えば、以下のコードの場合、isMemberOfClass:はNOを返します。

NSMutableData *myData = [NSMutableData dataWithCapacity:30];
id anArchiver = [[NSArchiver alloc] initForWritingWithMutableData:myData];
if ([anArchiver isMemberOfClass:[NSCoder class]])
    ...

クラスオブジェクトはコンパイラが生成するオブジェクトですが、メンバーシップの概念をサポートしています。

したがってこのメソッドは、レシーバと指定したクラスオブジェクトの照合に使用することができます。

aClass:テストに用いるObjective-Cクラスで表されるクラスオブジェクトを指定します。


release

- (oneway void)release

レシーバの参照カウントをデクリメントします。(必須)

参照カウントが0に達すると、レシーバはdeallocメッセージを送信します。

参照カウントのスキームを独自に定義した場合のみ、このメソッドを実装します。

このような実装では継承されたメソッドを呼び出すべきではなく、つまりsuperにreleaseメッセージを含めるべきではありません。

この仕組みについての詳細は『Advanced Memory Management Programming Guide(日本語版は『高度なメモリ管理プログラミングガイド』)』を参照してください。

特別な考慮事項

ガベージコレクションが有効な場合、このメソッドは何もしません。

releaseを呼び出す前に(initメソッドを使用して)オブジェクトの初期化を完了する必要があります。

例えば、以下のコードはエラーになります。

id anObject = [MyObject alloc];
[anObject release];

少なくともスーパークラスの指定イニシャライザを呼び出した上で、提供されたいくつかの理由で初期化に失敗した場合、initメソッド内からreleaseを呼び出すことができます。


respondsToSelector:

- (BOOL)respondsToSelector:(SEL)aSelector

指定されたメッセージに応答することができる継承されたメソッド、またはレシーバが実装されているかを示すブール値を返します。

aSelectorに応答可能な継承されたメソッド、またはレシーバが実装されている場合はYESを、それ以外の場合はNOを返します。(必須)

アプリケーションには、NOを返された時にエラーかどうかを検討して判断する責任があります。

オブジェクトがsuperキーワードを使ってrespondsToSelector:を送信することにより、メソッドがスーパークラスから継承しているかをテストすることはできません。

このメソッドはオブジェクト全体としてテストするだけで、実際のスーパークラスの実装まではテストしません。

したがって、superにrespondsToSelector:を送信することは、selfに送信するのと同じです。

代わりにオブジェクトのスーパークラスで直接NSObjectクラスメソッドのinstancesRespondToSelector:を呼び出す必要がある場合は、以下に示すのコードで表します。

if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
    // invoke the inherited method
    [super aMethod];
}

単純に [[self superclass] instancesRespondToSelector:@selector(aMethod)] とすると、サブクラスによって呼び出された場合に失敗する可能性があるため、使用することはできません。

間接的ではありますが、レシーバは他のオブジェクトにaSelectorメッセージを転送し、メッセージの応答を得ることができますが、実際にはこのメソッドはNOを返します。

aSelector:メッセージを識別するセレクタを指定します。


retain

- (id)retain

レシーバの参照カウントをインクリメントします。(必須)

戻り値はselfです。

オブジェクトを使用終了まで解放されるのを防ぎたい場合は、オブジェクトにretainメッセージを送信します。

参照カウントが0に達すると、オブジェクトは自動的に解放されます。

参照カウントはretainメッセージでインクリメントされ、releaseメッセージでデクリメントされます。

この仕組みについての詳細は『Advanced Memory Management Programming Guide(日本語版は『高度なメモリ管理プログラミングガイド』)』を参照してください。

ネストされた式で使用される可能性があるので、便宜上retainはselfを返します。

参照カウントのスキームを独自に定義した場合のみ、このメソッドを実装します。

このような実装ではselfを返す必要があり、superにretainメッセージを送信することによって継承されたメソッドを呼び出すべきではありません。

特別な考慮事項

ガベージコレクションが有効な場合、このメソッドは何もしません。



参考文献

NSObject Protocol Reference

Cocoaリファレンス日本語化計画/NSObject Protocol Reference






Bose SoundSport wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors