自動retainされないNSMutableSet

addObjectしてもretainされないNSMutableSetを作る。使い所はグローバル変数のstatic NSMutableSet *でこれを使って特定クラスのオブジェクトを詰め込んでいって、あるタイミングで全インスタンスに対して何か処理をする為。retainさせないのはreleaseタイミングはデフォルトのままにするため。まぁaddObjectしたらすぐにreleaseするのと大差ないんだけどね(その場合もSEGVには注意しないといけない)。

CFSetCallBacks assignCallbacks = kCFTypeSetCallBacks;
assignCallbacks.retain = NULL;
assignCallbacks.release = NULL;
NSMutableSet *assignSet = (NSMutableSet *)CFSetCreateMutable(kCFAllocatorDefault, 0, &assignCallbacks);

これで[assignSet addObject:obj];してもobjのretainCountは増えない。解放されたオブジェクトを触るとSEGVになるので、以下のようにaddするオブジェクトのクラスにおけるdeallocの中で外す。

- (void)dealloc
{
        if ([assignSet containsObject:self])
                [assignSet removeObject:self];
        [super dealloc];  // %orig;
}
上記のようにdeallocいじらないといけないので、単一のクラスのオブジェクトを詰め込む場合以外ぐらいに留めておくのがよさそう。

参考 http://decafish.blog.so-net.ne.jp/2010-10-27-1