プログラミング系のネタをまとめていきます。

クラス

クラス宣言


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

release, deallocの違い

releaseretainCountをデクリメントする。retainCountが0になったら、deallocを呼ぶ。
deallocデストラクタ的な処理

参考サイト


シングルトンインスタンスの作成
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...

Menu

メインコンテンツ

プログラミング

機器

Macツール

各種情報

Wiki内検索

おまかせリンク

Androidアプリ

AdSense

技術書


管理人/副管理人のみ編集できます