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 複数行 マクロ」にて検索。
以下の記事を参考にさせて頂きました。