2012-01-20 10 views
6

Objective-C++プロジェクトの作業を開始します。これは、頑丈な設計を行う前に2つの言語の合成がどのように感じられるかです。私は自動参照カウントがC++とどのように統合されているのか非常に興味があります:NSObjectsのスマートポインタに相当するSTLコンテナ内の保持/解放を正しく処理します(cf. David Chisnallの記事http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3参照)。Objective-C++のキーとしてNSStringを使用する方法std :: map

NSStringsからC++値への型保証マッピングとしてSTLマップを使用したいと思います。

std::map<NSString*, MyType> mapping 

マッピングを宣言できます。このマッピングでは、メモリ管理が適切に処理されます。しかし、それは-[NSString compare:]の代わりにポインタ比較を使用しているので、NSString値のセマンティクスに正しく従いません。

ポインタ比較の代わりに文字列比較を使用するSTLマップを取得する最適な方法は何ですか?
std::less<NSString*>を特化しようとしますか?
std::map<NSString*, MyType, MyCompare>のような明示的なコンパレータを宣言すべきですか?
NSString*キーをoperator<を実装するスマートポインタにラップする必要がありますか?あなたがNSStringのの比較関数を呼び出すカスタム比較対象をしたいと思います

+0

あなたはどのように最もよく定義しますか?望ましい結果のスピードメモリは何ですか? – madmik3

+0

興味深い。私は、objcポインタがARCで簡単に動作することは知らなかった。 Chisnallの記事を見ると、マップ宣言に__weakまたは__strongを追加して機能させる必要があります。さもなければ彼らはPODsであり、動作しません。 (私はそれほど頻繁にやるのではなく、後のことを忘れるので、私はコンパイラの問題に答えることはできません) – smparkes

+0

ポインタが強い場合は、マークする必要はありませんが、彼らが弱い場合にのみ。とにかく、私は明示的コンパレータを使うつもりです。 – bames53

答えて

9

、このような何か:彼らはすべてのNSStringリテラルであれば、管理対象外NSStringインスタンスの

#include <functional> 
#include <map> 

struct CompareNSString: public std::binary_function<NSString*, NSString*, bool> { 
    bool operator()(NSString* lhs, NSString* rhs) const { 
     if (rhs != nil) 
      return (lhs == nil) || ([lhs compare: rhs] == NSOrderedAscending); 
     else 
      return false; 
    } 
}; 

std::map<NSString*, MyType, CompareNSString> mapping; 
+0

チップをありがとう!マッピングは比較オブジェクトとうまく機能します。私は条件をnilsの一貫した順序付けを使うように変更しました(最初は空文字列の前にソートされます)。 –

0

ポインタの比較は、罰金です。これはMRCでこれらの条件で動作しますが、もちろん重複した文字列値はなく、値は比較されます。

もしそうでなければ、Rossの一般的にもっと役に立つ答え(+1)を見てください。

関連する問題