きままにものづくり

日々の気付いたことなんかを書いてます。

objective-cの勉強

こんにちは、even_ekoです。
今日はobjective-cについて色々と学んだので、そのことについてまとめます。

今日、学んだのは以下の内容です。

  • カテゴリ
  • デリゲート
  • id型

カテゴリ

objective-cにはカテゴリという概念があります。これにより、大きなクラスを複数のファイルに記述したり、既存のクラスを拡張したりできます。

ためしに、NSObjectを拡張してみます。
NSObject+.h

#import <Foundation/Foundation.h>

@interface NSObject (_)
-(void) checkInstance;
-(void) checkClass;
@end

NSObject+.m

#import "NSObject+_.h"

@implementation NSObject (_)
-(void) checkInstance
{
	NSLog(@"extention is success in instance");
}
+(void) checkClass
{
	NSLog(@"extension is success in class");
}
@end

これで、NSObject+.hをimportすればcheckInstanceとcheckClassを呼び出すことができます。
iPhone用の空のアプリケーションとして、作ってみたので参考にしてみて下さい。iseki-masaya/Objective-C_category · GitHub

デリゲート

デリゲートを用いると、あるクラスで起きたイベントの処理を別のクラスで実装できます。C#には言語自体に組み込まれていますが、Objective-Cには組み込まれていません。
プロトコルを使用することで、デリゲートの動作ができます。なので、Objective-Cの場合はデリゲートはデザインパターンのひとつになります。
プロトコルは、javaのインターフェースに似たようなものです。インターフェースとの違いは、@optionalを使うことで実装しなくても良いメソッドも用意できるという点です。

id型

id型はオブジェクト全般を表す型です。
使い方は様々あります。下の例は、selfのsubviewの中からUIViewのみを取り出す処理です。

for (id object in self.view.subviews) {
    if ([object isKindOfClass:[UIView class]]) {
            UIView *vw = object;
            vw.frame = CGRectMake(0, 0, 0, 0);
        }
    }
}