☆Cocoa Foundationクラス勉強室0
NSクラスを使うために
以降説明する全てのCocoa Foundation(以下NS)クラスを使う場合は、
#import <Foundation/Foundation.h>
する必要がある。
UIKitを使うときは、
#import <UIKit/UIKit.h>
する必要がある。この場合、Foundation.hも自動的に読み込まれる。

ルートクラス;NSObject
NSObjectは全てのクラスの親になっているクラスである =全てのクラスがこれから継承されている。
なので、以下のメソッドは全てのクラスで使える。
NSObject
メソッド名動作
+(id)alloc インスタンスを生成(確保)する
-(id)init インスタンスを初期化する
+(id)new インスタンスを確保し初期化する
-(id)self 自分自身のオブジェクトを返す
-(void)release 参照カウンタを-1する
-(id)retain 参照カウンタを+1する
-(id)autorelease自動解放対象とする
-(int)retainCount参照カウンタを返す
-(id)copyインスタンスのコピーを返す
「例」s1をコピーしてs2を作成する
NSString *s1 = @"ほげ";
NSString *s2 = [s1 copy];
+(Class)classクラスオブジェクトを返す
「例」Class c = [NSString class]; // NSStringクラスのクラスオブジェクトを取得する
+(void)initializeレシーバーを初期化する(初回実行時のみ)
+(Class)superclassレシーバーの親クラスを返す
+(void)setVersion:(NSInteger)aVersionクラスのバージョンを設定する
+(NSInteger)versionクラスのバージョンを得る
+(NSString *)descriptionレシーバーの内容を示す文字列を返す
+(BOOL)isSubclassOfClass:(Class)aClassレシーバーのクラスが、子クラスもしくは同一クラスかどうか調べる
-(void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay delay時間経過後にインスタンス内のaSelectorを実行する。
-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait 指定されたスレッド上でメソッドを実行する
wait=ONなら実行終了まで待つ。
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait メインスレッドでメソッドを実行する
wait=ONなら実行終了まで待つ。
-(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg メソッドを新しいバックグランドスレッドで実行する
-(IMP)methodForSelector: (SEL)aSelector @selector()で得られたメソッドのインスタンス内の実行アドレスを得る
-(BOOL)respondToSelector:(SEL)aSelector指定されたセレクタ(インスタンスメソッド)が実在するかどうかを調べる
「例」
NSString *obj1 =[[NSString alloc]autorelease];
if ([obj1 respondsToSelector:@selector(className)]) {
   // 実在する
} else {
   // 実在しない
}
NSObjectプロトコル
プロトコルではあるが、実装はされているのでメソッドとして利用可能である。
プロトコル名動作
-(BOOL)isEqual: (id)objectオブジェクトが同じかどうか調べる
-(BOOL)isMemberOfClass: (Class)class指定クラスかどうか調べる
「例」BOOL b = [obj isMemberOfClass:[NSArray class]]; // objがNSArrayクラスであるかを判定
-(BOOL)isKindOfClass: (Class)class 同じクラスまたは子クラスかどうか調べる
「例」BOOL b = [obj isKindOfClass:[NSString class]]; // objがNSStringクラスまたはその子クラスであるかを判定
-(BOOL)conformsToProtocol:(Protocol*)aProtocol指定されたプロトコルに準拠しているか調べる
「例」NSString *obj1 =[[NSString alloc]autorelease];
NSLog([obj1 conformsToProtocol: @protocol(NSObject)]? @"YES" : @"NO");
-(id)performSelector:(SEL)aSelectorレシーバーに指定されたメッセージを送る(メソッドを実行させる)
「例」
id myClone = [anObject copy];
id myClone = [anObject performSelector:@selector(copy)];
id myClone = [anObject performSelector:sel_getUid("copy")];
-(id)performSelector:(SEL)aSelector withObject:(id)anObject 1引数でレシーバーに指定されたメッセージを送る(メソッドを実行させる)
-(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject 2引数でレシーバーに指定されたメッセージを送る(メソッドを実行させる)

UIKitを使えるようにしたときには、(カテゴリ)により、 以下のメソッドが追加される。
NSObject UIKit Additions
メソッド名動作
-(void)awakeFromNibxibをUIViewとして読み込む。
これを使えば、IBでUIViewが作成出来ることになるので、部品としての使い回しが可能になる。
UIViewControllerへの貼り付けはプログラムで行う必要はあるけど。
Objective-Cの基本動作というか、内部構造を知るにはこのNSObjectの理解は非常に重要である。 NSObjectの内部実装自体はCで行われているので、Cにどのような工夫をしてObjectiveしているのがわかるからである。 どうやって実行時に各クラスを継承させているか、 オーバーライドはどうなっているか、実行時に各種情報を得られるのはなぜかなど。 まあ、最初は知らなくても良いが、知るとより「Objective-Cが理解できる」というものである。