NSObject と intrusive_ptr の親和性
は結構高いと思うのです。
void intrusive_ptr_add_ref(NSObject* obj) { [obj retain]; } void intrusive_ptr_release_ref(NSObject* obj) { [obj release]; }
て書いて、あとは 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 にする必要がありそう。