Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSObjectクラス

INDEX>Foundation>

ほとんどのクラスのベースとなるクラス

apple(OS X)
apple(iOS)

解説

OS X

継承 なし。NSObjectはルートオブジェクトです。
準拠 NSObject
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 OS X v10.0以降
定義 NSClipView.h
  NSArchiver.h
  NSClassDescription.h
  NSKeyedArchiver.h
  NSObject.h
  NSObjectScripting.h
  NSPortCoder.h
  NSRunLoop.h
  NSScriptClassDescription.h
  NSThread.h


iOS

継承 なし。NSObjectはルートオブジェクトです。
準拠 NSObject
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 iOS 2.0以降
定義 NSKeyedArchiver.h
NSObject.h
NSRunLoop.h
NSThread.h

概要

ほとんどのクラスのベースとなるクラスです。(NSProxyはNSObjectのサブクラスではない)オブジェクトの基本的な要素が含まれます。NSObjectを作成して使うことはなく、NSObjectのサブクラスとして使用します。

クラスの初期化

クラスを初期化する際に呼び出されるメソッドは2つあります。
+ loadメソッドはアプリケーションの起動時に(+ initializeメソッドは実際にクラスにアクセスする場合に呼び出されます。

作成、コピーオブジェクトの解放

オブジェクトを作成するには(+ allocメソッドを使用します。ゾーン指定付きの(+ allocWithZone:)メソッドもありますが以前のOS Xで使われていたもので、現在では使う必要はありません。
allocメソッドは(– initメソッドと合わせて使用します。NSObjectのサブクラスなどにもinitが付いたメソッド名 initWithString などがありますので、allocと組み合わせて使用します。
allocとinitを合わせた(+ newメソッドもあります。以前はinitWithObjectsなど便利な初期化メソッドを使うことが多く、使うことは少なかったのですが、ARCを使うとともにメソッドの(.)ドット記法が使われるようになったことで一部で使われ出しています。

allocの使用例

MyObject *obj = [[MyObject alloc] init];

オブジェクトをコピーするには(– copyメソッドを使用します。copyメソッドを使用するにはNSCopyingプロトコルに準拠していないといけませんが、NSObject自体はNSCopyingプロトコルに準拠していませんので、自作のクラスでcopyメソッドを機能させるためにはNSCopyingプロトコルに準拠するようにします。
+ copyWithZoneメソッドの引数zoneは以前のOS Xで使われていたものですのでnilを渡します。

NSCopyingプロトコルに準拠させる

@interface MyObject : NSObject <NSCopying>

変更不可なオブジェクトをコピーして変更可能なオブジェクトにするには(– mutableCopy)を使います。たとえばNSArrayをNSMutableArrayにする場合などに使用します。ゾーン指定のある(+ mutableCopyWithZone)もありますが現在ではzone指定は使用しません。

オブジェクトを破棄するには(– deallocメソッドを使用します。ARC環境では使用できません。

クラスのID

クラス名を文字列で取得する場合は(+ classメソッドを使用します。親クラスを文字列で取得する場合は(+ superclassメソッドを使用します。
レシーバが指定したクラスのサブクラスであるかどうかを調べるには(+ isSubclassOfClassメソッドを使用します。

[MyObject isSubclassOfClass:[NSObject class]]

クラスの関数をテスト

レシーバのクラスが指定したメソッドが反応するかを調べるには(+ instancesRespondToSelectorメソッドを使用します。引数には(SEL)が必要ですので@selector指示子やNSSelectorFromString()関数などを使ってメソッドを指定します。

[MyObject instancesRespondToSelector:NSSelectorFromString(@"testMethod")]

プロトコル適合のテスト

レシーバのクラスが指定したプロトコルに準拠しているかどうかを調べるには(+ conformsToProtocolメソッドを使用します。

  MyObject *obj = [MyObject new];
    
  NSLog(@"%s %p %@ %@",__FUNCTION__,obj,obj,([MyObject conformsToProtocol:@protocol(NSCopying)])?@"YES":@"NO");

メソッドについての情報の取得

– methodForSelectorメソッドは指定したメソッドの関数として呼び出すことができるアドレスを(SEL)として返します。通常使う必要はありませんが、繰り返しメソッドを呼び出す代わりに直接関数として呼び出すことでメソッド呼び出しのオーバーヘッドをなくし、高速化できる場合があります。クラスで指定してセレクタを返すには(+ instanceMethodForSelectorメソッドを使用します。

指定したセレクタからメソッドシグネチャ(NSMethodSignature)を得るには(+ instanceMethodSignatureForSelectorメソッドを使用します。メソッドシグネチャからメソッドの引数の数や型、返り値のタイプなどの情報を得ることができます。インスタンスからメソッドシグネチャを得ることができる(– methodSignatureForSelectorメソッドもあります。

詳細を得る

クラスの詳細を得るには(+ descriptionメソッドを使用します。

破棄可能なコンテントプロキシーのサポート

破棄可能なコンテントプロキシーを返すには(– autoContentAccessingProxyメソッドを使用します。NSAutoContentAccessingProxyプロトコルの準拠が必要です。

メッセージの送信

指定したセレクタにメッセージを送信するにはオプションの違いにより複数メソッドがあります。セレクタ・オブジェクト・遅延時間で送信するには(– performSelector:withObject:afterDelayメソッドを使用します。さらにモードを指定できるメソッド– performSelector:withObject:afterDelay:inModes)もあります。

#pragma mark performSelector:withObject:afterDelay:
-(void)method019
{
    MyObject *obj = [[MyObject alloc] init];
    [obj performSelector:@selector(messageA)
              withObject:nil
              afterDelay:2
     ];
    [obj performSelector:@selector(messageWith:)
              withObject:@"Happy new year!"
              afterDelay:3
     ];
}

メインスレッドで実行させ、セレクタ・オブジェクト・終了まで待つかどうかでメッセージを送信するには(– performSelectorOnMainThread:withObject:waitUntilDoneメソッドを使用します。さらにモードを指定できるメソッド– performSelectorOnMainThread:withObject:waitUntilDone:modes)もあります。UIの処理などメインスレッドで行わなければならない処理に使います。

指定したスレッドで実行させ、セレクタ・オブジェクト・終了まで待つかどうかメッセージを送信するには(– performSelector:onThread:withObject:waitUntilDoneメソッドを使用します。さらにモードを指定できる(– performSelector:onThread:withObject:waitUntilDone:modesメソッドもあります。

バックグラウンドで実行させセレクタとオブジェクトでメッセージを送信するには(– performSelectorInBackground:withObjectメソッドを使用します。

すでに送信したメッセージをキャンセルするには(+ cancelPreviousPerformRequestsWithTargetメソッドを使用します。セレクタとオブジェクトを指定できる(+ cancelPreviousPerformRequestsWithTarget:selector:objectメソッドもあります。

メッセージのフォワーディング

レシーバが理解できないメッセージが送信されてきた場合に(– forwardingTargetForSelectorメソッドが呼び出され他のオブジェクトに転送する機会があります。レシーバが理解できない起動オブジェクトが送られてきた場合には(– forwardInvocationメソッドが呼び出されます。

メソッドの動的作成

クラスメソッドを動的に作成するには(+ resolveClassMethodメソッドを使います。インスタンスメソッドを動的に作成するには(+ resolveInstanceMethodメソッドを使用します。

エラーハンドリング

メッセージに対応していない、転送もできない場合に(– doesNotRecognizeSelectorメソッドが呼び出されます。

アーカイビング

アーカイブから展開された時に呼び出されるのは(– awakeAfterUsingCoderメソッドです。

アーカイブ時にクラスのバージョンをセットするには(+ setVersionメソッドを使用します。バージョンを取得するには(+ versionメソッドを使用します。
– classForCoderメソッドや(– classForKeyedArchiverメソッドはアーカイブされるされるときに呼び出されクラスを返します。

新しいクラスを作成する際に下位互換性のためにアンアーカイブの際に使うクラスの優先順序を渡すためにオーバーライドして使う(+ classFallbacksForKeyedArchiverメソッドがあります。

メソッド

クラスの初期化

+ initialize
+ load

作成、コピー、オブジェクトの廃棄

+ new
+ alloc
+ allocWithZone
– init
– copy
- release (ARCでは使用不可)
+ copyWithZone
– mutableCopy
+ mutableCopyWithZone
– dealloc (ARCでは使用不可)
– finalize OS X のみ、10.8で非推奨

クラスの機能をテストする

+ instancesRespondToSelector

プロトコルの準拠をテストする

+ conformsToProtocol

オブジェクトの詳細

+ description

ポージング

+ poseAsClass OS Xのみ、10.5以降非推奨

破棄可能なコンテントプロキシーのサポート

– autoContentAccessingProxy

ダイナミックリゾルブビングメソッド

+ resolveClassMethod
+ resolveInstanceMethod

エラーの取り扱い

– doesNotRecognizeSelector