読者です 読者をやめる 読者になる 読者になる

Tizen Native API のメソッド名末尾についてる N の意味

この記事は Tizen Advent Calendar 2013 に参加予定の記事です。



Tizen で Native アプリを開発していると、ときどき API の関数名の末尾に N が付いているのを見かけます。

たとえば身近なところでいうと

  • Tizen::Base::Collection::ArrayList::GetEnumeratorN()
  • Tizen::Net::Http::HttpRequest::ReadBodyN()
  • Tizen::Ui::Control::GetCanvasN()

といったようなメソッドたちです。

これは、「このメソッドの中で new によってメモリの確保が行われるので呼び出し元が責任を持ってそのメモリを解放してね♥」 という意味です。

覚え方: New の N(メソッドの中でオブジェクトを new している)

N で終わるメソッドを呼び出すときは可能ならば戻り値を std::auto_ptr とか std::shared_ptr とか std::unique_ptr とかを使って受け取るなどして、解放忘れを防ぎましょう。


なお、イベントハンドラ名に N が付いている場合、そこに渡されてくる引数のポインタを delete しなければならないという意味になります。

たとえば身近なところでいうと

  • Tizen::App::App::OnUserEventReceivedN()
  • Tizen::Io::IMessagePortListener::OnMessageReceivedN()

などがあります。

これらのメソッドをオーバーライドして実装するときは、引数のポインタを忘れずに delete しましょう。


余談ですが、このようにプラットフォームが確保したメモリをユーザコードの中で解放する、あるいは逆にユーザコードの中で確保したメモリをプラットフォーム側で解放する(Tizen::Ui::Container::AddControl() など)、というコーディング規約は当初すっごく気持ち悪く感じました。(今でもだいぶ気持ち悪いけど)

あと、Tizen::Ui::Container::AddControl() で思い出しましたが、今でこそ Deprecated になった Tizen::Ui::Container::AddControl(const Control& control) というメソッドは、そのメソッドの仕様を二度見、三度見(えっ、・・・えっ・・・、えっ・・?!?)しましたし、軽く冷や汗をかいてひと通り我が目を疑った後にこのライブラリと今後しばらく付き合っていくのかと考えると意識がうっすらと遠のいたのを今でも覚えています。
const 参照で渡したコントロールのインスタンスを、コンテナ側で delete してくれるってどういうことよ!?っていう。
今は Tizen::Ui::Container::AddControl(Control* pControl) になったのでいくらかマシですね。


クラスライブラリの設計の筋の良さ的にはぜひ Qt for Tizen に普及してもらいたいです。