最終更新:
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...


最新コメント