スポンサード リンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 最近のネットは日本語が変 | トップページ | ドコモのiPhone6は酷いらしい »

最近のObjective-C

今は、OSX用Mirror-DTCのネイティブ版を開発中で、クライアントは既に動作しているのだが、ここ数日は、そのコードを色々と弄っていた。これは、コードをUbuntu用のネイティブ版にも使える様にしたいからなのだが、最近のObjective-Cに馴染む必要もあったからだ。

今回の開発を始めるにあたっては、最初に、色々と調べた内容を書いたのだが、最近のObjective-CではARCが使われる様になっている。なので、作者的には、昔よりもコーディングは楽になっている。

ただし、作成したオブジェクトが破棄されたかどうかは、コードを見ていても確信は出来ないので不安が残る。

まあ、今回開発しているMirror-DTCクライアントというのは、主要部分はC++で書いていて、C++コード内でnewを使って作成するオブジェクトはdeleteを使って削除出来る。

そして、Objective-Cで作成したオブジェクトというのは、もし、破棄されていなかったとしても、大してメモリは食わないので、実際問題としては、削除されていなかったとしても、問題は殆ど無いのだが、Cocoa用のオブジェクトはNSObjectを継承してきているので、破棄されるタイミングで必ずdeallocメソッドが呼ばれる。

なので、作成したオブジェクトが破棄されたかどうかについては、このdeallocメソッドをオーバーライドしてNSLogでも埋め込んでおけば、確認できるので、作者的には、この際なので、どういう時にオブジェクトが破棄されるのか、なんて事についても確認しているのだが、中々、複雑だ。

当然の事ながら、単純なオブジェクトを自分でallocした場合には、そのオブジェクトへのポインタを格納している変数が全て無くなれば、オブジェクトは破棄される。

問題は、UI用に作成しているダイアログみたいなモノで、こういうモノは、中々、意図したタイミングでは破棄してくれない。

なので、Objective-Cがオブジェクトを破棄してくれる様に、破棄されないUI部品については、performCloseを行う様に変更を入れたりしたのだが、画面上に表示しているWindowが全てなくなると、オーバーライドしたメソッドでNOと記述してあるにも関わらず、プログラムは終了してしまう。

このため、状況に応じて、performCloseではなく、orderOutを使う様にしてあるのだが、orderOutでは、Windowの表示は消去されるものの、実体は残っている様で、それを参照する変数を無くしてみても、上記のdeallocは呼ばれないという不思議な状況になる。

もっとも、これは、作者がC++の関数内で上記の様な操作を行っているからかもしれない。何故なら、同じ様な処理をObjective-Cのメソッド内で行っているオブジェクトについては、普通に、deallocは呼ばれているからだ。

と、いう事で、開発を始める時に、それとなく書いた様に、ARCというのは、全般的にはコーディング作業を楽にしてくれるのだが、C++で自前でメモリ管理している場合と比べると、メモリリークの危険度が上がっているかもしれない。

つまり、これはJava版の開発時にも書いたのだが、こういった自動メモリ管理システムにメモリを破棄させる為には、細心の注意が必要で、少なくとも、初心者が使う分には、C++で自前でメモリ管理する場合よりも、メモリリークの危険度は高くなる筈だ。

で、上記以外にも、最近のObjective-Cには何個か注意が必要な部分があって、その一つは、プロパティ変数を記述する時に使える様になったドット記法だ。

通常は、C++やJavaを使っている作者的には、上記のドット記法は馴染み深いモノなので、当初、この記法を使っていたのだが、色々な場面で使っていると、この記法の場合、作者が意図する挙動を示してくれない場合がある事が判った。

具体的には、変数のポインターを取り出そうとする様な場合、従来のアンダーバーを先頭に書くアクセス方法では、問題なく取り出せるのだが、ドット記法では、文法的にエラーと判断されてしまう訳だ。

ネットを見ていると、上記のドット記法を行うと、コンパイラはアクセッサメソッドと置き換える、みたいな事が書かれていたので、もしそれが本当だとすると、当然の事ながら、アクセッサメソッドへのポインタというのは、作者が意図するポインタではないので、文法エラーも出る訳だ。

なので、作者的には、極力、ドット記法はヤメ、アンダーバーを先頭に付ける方法で、プロパティにはアクセスする方向にしたのだが、C++関数内では、このアンダーバーによる記述は許されない。

そして、C++関数はObjective-Cのクラスメソッドには出来ないので、C++関数内では、selfも使えない訳だ。

このため、Objective-Cのメソッド内からC++関数を呼び出し、その関数内でObjective-Cのプロパティにアクセスしたい場合には、selfをポインターとして渡し、C++関数内では、このポインターを使って、self.変数、みたいな感じでドット記法でアクセスする必要がある。

作者的には、そんな不統一なアクセス形態は取りたくないので、C++関数をObjective-Cのメソッドにしてしまいたい所ではあるのだが、冒頭に書いた様に、コードは、極力、Ubuntuでも使える様にしたいので、Objective-Cのメソッドは、あまり、作れない訳だ。

と、いう事で、Objective-C絡みのコーディングネタは、書き始めるとキリが無いくらいにあるのだが、そもそも、今時は、プログラミングの経験が無い人が多くなっている上に、マイナーな言語であるObjective-Cについて語ってみても、それに意味を感じる人がどれだけいるのだろうか、と、鑑みると、虚しい訳だ。

なので、ここの所、時事ネタを増やしているのだが、サーバーの開発はこれからという感じなので、これから数週間も、こんな感じが続くかもしれない。

= この記事に関連する公開中ソフト =

Mirror-DTC

Mirror-DTC

(2015/02/15追加)

« 最近のネットは日本語が変 | トップページ | ドコモのiPhone6は酷いらしい »

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/534482/60345478

この記事へのトラックバック一覧です: 最近のObjective-C:

« 最近のネットは日本語が変 | トップページ | ドコモのiPhone6は酷いらしい »

2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    Cookieを無効にする設定およびAdsenseに関する詳細については、以下のリンクを参照下さい。

    広告 - ポリシーと規約 - Google