UUID識別子の生成をマクロ登録する

投稿者: | 2013/09/10

UUIDを使って識別子を得る

オブジェクトなどを一意に識別するためにUUIDを使って識別子を生成するというTips を先日書きました。


 

結構使うのでマクロにすることにしました

書いたはええんですが、この識別子生成、色々なクラスにちょいちょい実装するんですよね。

クラスごとに置くのは面倒だし、AppDelegate にでも生成関数を置いて…。
などとも考えたのですが、生成した識別子のインスタンス管理はどーすんだよ?とかよくわかっていないのでおっかない。

そこで、見出しにもある様に生成部分のコードだけマクロに登録することにしました。
んで、インスタンスは実装先にインスタンス変数identifier_ を用意して、そこに格納。

 

こんな感じ

まず実装先クラスの.h ファイルにインスタンス変数identifier_ を用意。
マクロで格納先の変数名まで指定しちゃっているので、これ(変数名)は固定にしています。

MyClass.h

#import <Foundation⁄Foundation.h>

@interface MyClass : NSObject {
    NSString* identifier_; // 識別子格納先
}

// 識別子利用のためのプロパティ
@property (nonatomic, readonly) NSString* identifier;

@end

 

次に、[自分のアプリケーション].pch ファイルにUUID識別子生成のマクロを登録。
マクロ名はINIT_UUID_IDENTIFIER としました。
(.pch ファイルは、プロジェクト内のSupporting Files グループ下にいるはずです。)

MyApp.pch

#define INIT_UUID_IDENTIFIER CFUUIDRef uuid;
uuid = CFUUIDCreate(NULL);
identifier_ = (__bridge_transfer NSString*)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);

 

最後は実装先クラスの.m ファイルのinit 関数にマクロ呼び出しを書いて終了。
(init 関数は自前で実装します。)

MyClass.m

#import "MyClass.h"

@implementation MyClass

@synthesize identifier = identifier_;

- (id)init {
    self = [super init];
    if ( !self ) {
        return nil;
    }
    
    INIT_UUID_IDENTIFIER; // マクロ呼び出し
    
    NSLog(@"Identifier = %@", self.identifier); // ちゃんと出力できる?
    
    return self;
}

@end

 

これで、新しいクラスでUUID識別子を使いたいときは、インスタンス変数identifier_ を用意し、
init 関数内でマクロ INIT_UUID_IDENTIFIER を呼び出すだけでユニークな識別子を生成できます。

 

ちゃんと生成できているか確認しましょう

マクロの設置と使用手順は以上ですが、本当にちゃんと動くか確認しましょう。

具体的には、どこかにクラスのオブジェクトを生成してから、identifier プロパティを呼び出してみて下さい。
できれば同一インスタンスのidentifier を複数箇所で。

それぞれが同じ値であれば、正しく識別子は生成され、保持されているということになります。

 

参考

長いマクロの改行をどうするのか知りませんでした。
バックスラッシュを行末に付記すればええんですね。

Google検索で「Objective-C 複数行 マクロ」にて検索。
以下の記事を参考にさせて頂きました。


 



 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください