【プログラミング言語】Objective-C を学び始めた時に書いていたメモ

DEVELOP

パソコンを整理していたらObjective-Cのための古いメモが出てきました。言語を覚えるときは基本を公式リファレンスなどを流し読みしてメモしています。出向に行く前に走り書きする感じです。

//-----------------------------------------------------------------------------
// class
//-----------------------------------------------------------------------------
#import <stdio.h>
#import <objc/Object.h>
//-----------------------------------------------------------------------------
// Test・宣言
@interface Test : Object
    - (void)Foo;
    - (void)Func;
    - (void)Write;
    + (void)globalFunc;
@end
 
// Test・実装
@implementation Test
- (void)Foo
{
    printf( "call Foo.\n");
    // 自身の関数呼び出し。
    [ self Func ];
}
 
- (void)Func
{
    printf( "call func.\n");
}
 
- (void)Write
{
    printf("call write.\n");
}
 
// 静的関数。
+ (void)globalFunc
{
    printf("call Test globalFunc.\n");
}
 
@end
 
//
//
// カテゴリー
// 同じオブジェクトをファイルを分けて作業する場合などに使用する。
// 使用するには、すでに実態が宣言されている必要がある。
//
@interface Test (Category) //Category:任意の名。
@end
// Test・実装
@implementation Test (Category)
@end
//-----------------------------------------------------------------------------
// Point・宣言
@interface Point : Object
{
@private
    int x;
    int y;
}
// イニシャライザ
- (id)init;
// 指定イニシャライザ
- (id)initWithPoint:(int)x int:(int)y;
 
// 開放
-(id)free;
 
// ポイント設定。
- (void)setPoint:(int)_x int:(int)_y;
 
// ポイント取得(X)
- (int)getX;
 
// ポイント取得(Y)
- (int)getY;
@end
 
// Point・実装
@implementation Point
 
// イニシャライザ
- (id)init
{
    [super init];
 
    printf( "call init.\n");
 
    return [self initWithPoint:0 int:0];
// return self;
};
// 指定イニシャライザ
- (id)initWithPoint:(int)_x int:(int)_y
{
    self->x = _x;
    self->y = _y;
return self;
}
// 開放
- (id)free
{
printf("call free.\n");
return [super free];
}
// ポイント設定。
- (void)setPoint:(int)_x int:(int)_y
{
// self=this
self->x = _x;
self->y = _y;
}
// ポイント取得(X)
- (int)getX
{
return x;
}
// ポイント取得(Y)
- (int)getY
{
return y;
}
@end
//-----------------------------------------------------------------------------
// SuperClass・宣言
@interface SuperClass : Object
- (void)FooSuper;
@end
// SuperClass・実装
@implementation SuperClass
- (void)FooSuper
{
printf( "call FooSuper.\n");
}
@end
// SubClass・宣言
@interface SubClass : SuperClass
@end
// SubClass・実装
@implementation SubClass
- (void)FooSub
{
printf( "call FooSub.\n");
}
@end
// OvefRide・宣言
@interface Override : SuperClass
@end
// OvefRide・実装
@implementation Override
- (void)FooSub
{
printf( "call OverRide FooSub.\n");
}
@end
//
// プロトコル
// メソッドをクラス間で共有する
//
//
@protocol ClassNameToString
- (id) ToString;
@end
@interface A : Object
{
char *name;
}
- (id)init;
- (id)free;
@end
@implementation A
// イニシャライザ
- (id)init
{
return self;
}
- (id) free
{
return [super free];
}
- (id) ToString { return (id) name; }
@end
@interface B : Object
@end
@implementation B
- (id) ToString
{
return (id)"This is Object of B Class";
}
@end
@protocol InstanceListener
- (void) InstanceFree:(id)object;
@end
@interface Listener : Object
{
id <InstanceListener> listener;
}
- (id) init;
- (id) free;
- (void)SetInstanceListener:(id <InstanceListener>)l;
- (id <InstanceListener>)GetInstanceListener;
@end
@implementation Listener
- (id) init {
[super init];
listener = NULL;
return self;
}
- (id) free {
if (listener) [listener InstanceFree:self];
return [super free];
}
- (void)SetInstanceListener:(id <InstanceListener>)l {
listener = l;
}
- (id <InstanceListener>)GetInstanceListener {
return listener;
}
@end
@interface WriteInstanceFree : Object <InstanceListener>
@end
@implementation WriteInstanceFree
- (void) InstanceFree:(id)object {
printf("%X:インスタンスが解放されました\n" , object);
}
@end
// プロトコルの継承。
@protocol ProtocolA
- (void) MethodA;
@end
@protocol ProtocolB
- (void) MethodB;
@end
@protocol ProtocolC <ProtocolA>
- (void) MethodC;
@end
@interface TestProt : Object <ProtocolB, ProtocolC>
@end
@implementation TestProt
- (void) MethodA { printf("This is MethodA\n"); }
- (void) MethodB { printf("This is MethodB\n"); }
- (void) MethodC { printf("This is MethodC\n"); }
@end
//-----------------------------------------------------------------------------
int main( int _argc, char* argv[] )
{
    // 記述1
    {
        id obj = [Test alloc]; // インスタンス生成。
        [obj Foo]; // 関数呼び出し
    }
    {
        // 記述2(使い捨て)
        [[Test alloc] Foo];
    }
    {
        // 静的関数。
        [Test globalFunc];
    }
    // スコープは使える。
    {
        id point1 = nil;
        point1 = [Point alloc];
        // ポイント設定。
        [point1 setPoint:16 int:32];
        printf( "point1:X=%d, Y=%d\n", [point1 getX] , [point1 getY] );
    }
    // クラスの継承。
    {
        id obj = [SubClass alloc];
        [ obj FooSuper ];
        [ obj FooSub ];
    }
    // オーバーライド。
    {
        id obj = [Override alloc];
        [ obj FooSub ];
    }
    // イニシャライザ。
    {
        // インスタンス生成
        id pt1 = [Point new];
        // インスタンス開放
        [ pt1 free ];
        // 指定イニシャライザ
        id pt2 = [[Point alloc] initWithPoint:400 int:300];
        printf( "pt2:X=%d, Y=%d\n", [pt2 getX] , [pt2 getY] );
    }
    // オブジェクトの開放。
    {
        Point* ptobj = [Point new];
        [ ptobj free ];
    }
    // クラスを表すオブジェクト。
    {
        Class testClass = [Test class];
        [testClass globalFunc];
        [[testClass new] free];
        [testClass free];
    }
    // セレクタ
    {
        id obj;
        SEL method;
        obj = [Test new];
        method = @selector(Write); // 関数決定。
        [obj perform:method];
    }
    // 関数呼び出し(早い)。
    {
        id obj;
        SEL method;
        IMP func;
        obj = [Test new];
        method = @selector(Write);
        func = [Test instanceMethodFor:method];
        func(obj , method); // メッセージじゃないので早い。
    }
    // プロトコル。
    {
        id objA = [A new];
        id objB = [B new];
        printf("objA = %s\n" , [objA ToString]);
        printf("objB = %s\n" , [objB ToString]);
        [objA free];
        [objB free];
    }
    // リスナー
    {
        id obj1 = [Listener new] , obj2 = [Listener new];
        id <InstanceListener> listener = [WriteInstanceFree new];
        [obj1 SetInstanceListener:listener];
        [obj2 SetInstanceListener:listener];
        [obj1 free];
        [obj2 free];
    }
    
    // プロトコルの継承。
    {
        id obj = [TestProt new];
        [obj MethodA];
        [obj MethodB];
        [obj MethodC];
        [obj free];
    }
 
    getchar();
 
    return 0;
}

Posted by kazupon