最終更新: bokkuri_orz 2013年11月27日(水) 22:53:23履歴
MyClass.h
// NSObjectを継承する @interface MyClass : NSObject { // アクセス指定 (private/protected/public) @private int m_value; NSString* m_str; } // イニシャライザ -(id)new という書き方もある -(id)init; // 値取得メソッド(引数無し) -(int)getValue; -(NSString*)getString; // 値設定メソッド(引数あり) -(void)setValue:(int)val; -(void)setString:(NSString*)str; // 値設定メソッド(引数2つ) (メソッド名:(型1)引数名1 キーワード2:(型2)引数名2; ※3つ目以降も同様) -(void)setParams:(int)val strVal:(NSString*)str; @end
MyClass.m
#import <main.h> @implementation MyClass -(id)init { m_value = 0; m_str = nil; // 自分自身を返す return self; } -(int)getValue { return m_value; } -(NSString*)getString { return m_str; } -(void)setValue:(int)val { m_value = val; } -(void)setString:(NSString*)str { m_str = str; } -(void)setParams:(int)val strVal:(NSString*)str; { m_value = val; m_str = str; } @end
#import <main.h> { MyClass* obj = [[MyClass alloc] init]; [obj setParams:123 strVal:@"abcdefg"]; NSLog( [NSString stringWithFormat:@"getValue : %d", [obj getValue]] ); NSLog( [NSString stringWithFormat:@"getString : %@",[obj getString]] ); }
C#、Javaで言う、インターフェースに近いもの。
●使用例
@protocol HogeProtocol -(BOOL)isActive; -(BOOL)isVisible; @end @interface Hoge : UIView<HogeProtocol> {} @end @interface Fuga : NSObject<HogeProtocol> {} @end
プロトコルを採用したオブジェクトを順に処理するには、以下のようにします。
NSMutableArray *array; for(id<HogeProtocol> obj in array) { if([obj isActive]) { // アクティブ判定 } }
●クラス宣言
- allocWithZone, retainCount, releaseなどをオーバーライドする
- loadはお好みで。ここでインスタンスを生成するのが、一番早いタイミングっぽいです。
- load, allocWithZoneはクラスメソッド。
- クラス変数の概念がないので、ヘッダファイルにはインスタンスを宣言しない。
@interface Singleton : NSObject { } // load:クラスがランタイムで読み込まれる時に呼ばれる +(void)load; +(id)allocWithZone:(NSZone*)zone; -(unsigned)retainCount; // イニシャライザ -(id)init; -(void)release; -(id)autorelease; -(void)dealloc; @end
●クラス実装
- インスタンスのstatic変数を定義。
- 解放できないオブジェクトとするために、retainCount, release等をオーバーライド。
@implementation Singleton // Objective-Cではクラス変数が存在しないので、実装部分で static 変数を定義する static Singleton* s_instance = nil; +(void)load { if(s_instance == nil) { s_instance = [[Singleton alloc] init]; } } +(id)allocWithZone:(NSZone*)zone { @synchronized(self) { if(s_instance == nil) { // 1回目の割り当てのみ、メモリを確保してインスタンスを返す s_instance = [super allocWithZone:zone]; return s_instance; } } // 以降はメモリを割り当てずに nilを返す return nil; } -(unsigned)retainCount { return UINT_MAX; // 解放できないオブジェクトであることを示す } -(id)init { // コンストラクタ的な処理 return self; } -(void)release { // 何もしない } -(id)autorelease { return self; } -(void)dealloc { // デストラクタ的な処理 [super dealloc]; } @end
シングルトンインスタンスの作成
https://developer.apple.com/jp/documentation/Cocoa...
Objective-C Singleton(シングルトン)クラスの実装 -
http://programming-ios.com/objective-c-singleton/
releaseとdeallocの違い
http://blog.livedoor.jp/yousuke_saki/archives/5148...
最新コメント