NSObject と intrusive_ptr の親和性

は結構高いと思うのです。

void intrusive_ptr_add_ref(NSObject* obj)
{
    [obj retain];
}
void intrusive_ptr_release_ref(NSObject* obj)
{
    [obj release];
}

て書いて、あとは boost::intrusive_ptr とか boost::intrusive_ptr とかを使うだけ。
これは特に、戻り値として autorelease せずに返したい場合に使える。
昨日の例だと、

intrusive_ptr<NSString> ToNSString(const unichar* str, int len)
{
    return intrusive_ptr<NSString>(
        (NSString*)CFStringCreateWithCharactersNoCopy(NULL, str, len, kCFAllocatorNull),
        false);
}

こうすることで、autorelease したくない場合にわざわざ生で書く必要がなくなる。


あれ、でも NSObject と NSString って C++ での継承関係あったっけ……?
無い場合は intrusive_ptr_add_ref を id にする必要がありそう。