サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
デスク環境を整える
lifeaether.homeunix.net
iOS5で久しぶりにわくわくしてきたので、ブログの更新が増えるといいですね。ところで、Automatic Reference Counting (ARC) が非常に気になるので、ちょっと調べてみました。英語力とコンパイラについての知識があまり豊富でないので、間違っているところもあるかもしれませんが、ある程度納得できたのでまとめてみます。 Automatic Reference Counting(以後ARC) は、簡単に言うと retain/release を自動挿入する技術で、手動でやっていた参照カウンタを自動でやってくれるものです。したがって、ARCの対象となるのはObjective-Cのオブジェクトとなります。このオブジェクトにはBlocksオブジェクトも含まれますが、Core Foundationのオブジェクトは含まれません。 ARCを使うには、いくつかの制約があります。詳しくはAR
Objective-C でよく使われるパターンとして、デリゲートがあります。C# などの言語では、デリゲートは言語の機能としてありますが、Objective-C では、言語としてデリゲートの機能があるわけではありません。 概要 Objective-C でのデリゲートとは、あるインスタンスに送られたメッセージを、そのまま別のあるインスタンスに受け流し、そのインスタンスにメソッドの実行を委ねることです。Objective-C では、メッセージの転送が容易に可能なので、このようなデリゲートの実現がされています。 上の図は、sender が receiver に message: を送信したところ、 receiver の delegate インスタンスにメッセージ転送が起きた図です。 デリゲートの実例 Cocoa Application において、デリゲートはさまざまなところで利用されています。
まだあまり相手にされていない感じの Blocks ですが、使うことができるシーンは結構あります。 NSURLConnection を使用すると、簡単にWEBからリソースを取得できますが、多少記述が多くなってしまうのと、デリゲートによって処理が散らばってしまうのが問題です。そこで、Blocks を使って、よりモダンな書き方ができるようにしてみます。 今回は NSURLConnection にカテゴリとして追加することにしました。使い方はこんな感じになります。 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://lifeaether.homeunix.net/"]]; [NSURLConnection sendRequest:request completeBlock:^( NSD
なぜ Objective-C は気持ち悪いのか分析してみる企画。前回はコードの見た目について考えましたが、今回はクラスについて考えてみます。 動的な生成のみ Objective-C は、静的なインスタンスを生成することはできず、必ず動的なインスタンスを生成しなければなりません。常にポインタで扱うことになるので、高速な反面、メモリ管理の煩わしさが常につきまといます。通常、インスタンスの生成、破棄は次のようにします。 id object = [[NSObject alloc] init]; [object release]; NSObject に対して alloc メッセージを送り、インスタンスのメモリ領域を生成します。そのあとに、それに init メッセージを適用し、インスタンスを初期化します。ほとんどの場合、alloc, init はペアにして実行します。なぜなら、alloc しても in
Objective-C が奇妙に見える大きな要因のひとつは、明らかにメッセージ式の存在だと思います。なぜ Objective-C はメッセージ式という奇妙な式を用いてメソッドを呼び出すようになったのでしょうか? Objective-C の作者にどういった意図があったのかは知りませんが、私なりに Objective-C がメッセージ式でなければいけない理由を見つけていますので、そのお話をしようと思います。 まず、他の多くの言語で採用されている、 . によるメンバアクセスによるメソッド呼び出しを考えてみましょう。 anObject.method( ); みなさんはこれをどう解釈するでしょうか? インスタンス anObject の method メソッドを実行する。そう解釈するのが普通だと思われます。なぜなら、 . は、多くの場合メンバへのアクセスを意味するもので、 anObject のメンバで
インスタンスの生成から、メソッドの実行、そしてインスタンスの破棄まで説明します。 メソッドの実行 インスタンスの生成の前に、まずはじめにメソッド実行の書き方を説明します。なぜなら、インスタンスの生成はクラスメソッドを用いて行うからです。Objective-C では、メソッドの実行をメッセージ式で書きます。メッセージ式とは、次のような形式をとります。 [anObject method:arg0 label1:arg1 label2:arg2 label3:arg3 .... labelN:argN ]; また、引数を取らないメソッドの場合 [anObject method]; となります。 anObjectは、メソッドを実行するインスタンスとなります。Objective-Cでは、それをレシーバと呼びます。method にはメソッド名が入り、argNには、それぞれメソッドの引数が入ります。では
Xcode での CUI プログラムの作成と実行、Objective-C 基本的な事柄について書きます。 CUIプログラムの作成 1. 開発環境のインストール OS X は、最初から開発環境がインストールされているわけではありませんが、OS X のインストールディスクに開発環境のインストーラーが入っています。まだインストールしていない場合、インストールをしましょう。また、最新の開発環境は、ADCから入手可能です。 2. Xcode を起動 開発環境である Xcode を起動します。デフォルトの設定では、Xcode は /Developer/Applications/Xcode にインストールされています。 3. プロジェクトを新規作成 メニューから、「ファイル」>「新規プロジェクト作成」を選択します。 4. Command Line Tools Foundation を選択 Objecti
Objective-C の基本的なクラスを紹介します。ここで紹介できるクラスやメソッドは、Cocoa フレームワークのほんの一部に過ぎません。詳細は、クラスリファレンスを御覧下さい。 メモリ管理の例を示すために、解放の必要のあるものについては、最後に release メッセージを送信するコード書いていますでの、合わせて御覧下さい。 NSString NSString は、文字列を表すクラスです。NSString は大変高機能なクラスであり、文字列に関するさまざまな処理を行えます。NSString は不変(immutable)なインスタンスであり、文字列を切り出したりするメソッドを使用すると、新しい NSString を返します。 作成 NSString は、たくさんのイニシャライザが用意されているので、いろいろな方法で作成することができます。 NSString *s1 = @"string
参照カウンタ方式は、一般的なメモリ管理手法として、よく知られているので、wikipedia などを説明をご覧頂きたい。 メモリオーナーシップ Objective-C では、メモリオーナーシップという概念に基づき、メモリ管理をします。メモリオーナーシップとは、メモリの所有権のことです。すなわち、あるインスタンスには、その所有権があるということです。誰が所有するのか?それもインスタンスです。あるインスタンスは、他のインスタンスに所有されるのです。ただし、あるインスタンスの所有者は、複数存在することもあることに注意が必要です。 この所有関係が、直接、参照カウンタの関係とつながります。つまり、所有者が、所有されるインスタンスの retain count を+1し、所有者がインスタンスの所有権を放棄すると、インスタンスの retain count を-1します。これにより、あるインスタンスが所有され
iMacを買って、せっかく新しい開発環境も揃ったので、早速気になるブロック構文を試してみます。一般に、クロージャとか呼ばれているものに似ているらしいですが、そもそもクロージャ自体あまり知らないので、恐る恐る試している次第です。とりあえず手始めに、Wikipediaに書いてある クロージャコードを、Objective-Cで書いてみることにしました。 クロージャ(Wikipedia)のJavascriptの例 function newCounter() { var i = 0; return function() { // 無名関数 i = i + 1; return i; } } c1 = newCounter(); alert(c1()); // 1 alert(c1()); // 2 alert(c1()); // 3 alert(c1()); // 4 alert(c1()); //
iPhone の流行により、 Objective-C に興味のあるプログラマが増えてきたので、ここに Objective-C のクイックリファレンスを書くことにします。対象は、すでに他のオブジェクト指向言語習得者です。たとえば、Java や C++ といったプログラマを対象としています。必要最低限のことをまとめたので、より詳細は他のところで補完してください。 目次 基本 クラスの使い方 クラスの宣言・実装 プロパティ メモリ管理 基本的なクラス デリゲート プロトコル カテゴリ 例外 Key Value Coding Key Value Observing Notification Blocks Grand Central Dispache Objective-C の特徴 Objective-C を表すいくつかのキーワードを思い浮かべると、「ルーズ、テキトー、ダイナミック、シンプル」などと
iPhone OS 向けのアプリケーション開発で注目を浴びている Objective-C 言語ですが、Objective-C についてあまりいい噂を耳にしないので、なぜそうなってしまうのかという分析をしてみることにしました。記事が長くなりそうだったので、今回は見た目編です。 1. 見た目 プログラミング言語において、見た目というものは重要な要素のひとつです。Objective-C 言語はオブジェクト指向言語でありますが、実際のコードをみてみると、ほかのメジャーな言語とはちょっと違った構文がとられています。 メッセージ式 Objective-C では、メソッド呼び出しをメッセージ式で記述します。以下は、anObject に message というメッセージを送る例です。 [anObject message]; [anObject message:arg1]; [anObject messag
Cocoaからコマンドライン型のプログラムを実行したい時は、NSTaskを使います。NSTaskを使うと、かなり簡単に外部のプログラムを実行することができます。単に実行するだけならば、おそらくリファレンスを見るだけですぐ使い方がわかると思いますので、出力を読み取る方法を説明します。 単に読み取る場合、次のようにします。 NSTask *task = [[NSTask alloc] init]; NSPipe *pipe = [[NSPipe alloc] init]; [task setLaunchPath:@"/bin/ls"]; [task setStandardOutput:pipe]; [task launch]; NSFileHandle *handle = [pipe fileHandleForReading]; NSData *data = [handle readDataT
Objective-C のメモリ管理の話をします。Objective-C ではどのようなルールに基づいてコーディングすればよいかを説明します。 alloc, copy, new を送信したオブジェクトは、それによって生成されたオブジェクトを所有します。また、retain を送信したオブジェクトは、その受信側のオブジェクトを所有します。 所有しているオブジェクトが不要になったら、そのオブジェクトに release メッセージを送信して、所有を放棄しなければなりません。 所有してないオブジェクトに release メッセージを送信して、そのオブジェクトを放棄しようとしてはいけません。 補足して、次のようなことも頭に入れておきましょう。 誰もオブジェクトを所有しなくなったとき、そのオブジェクトには dealloc メッセージが送信され、そのあとメモリから解放されます。 あるオブジェクトを複数のオ
積極的に利用すべきものであるのに、未だに利用していない機能、第三弾、ドット構文です。 これは完全に Objective-C の話です。Objective-C 2.0 からはプロパティ構文が追加され、ドット構文によるアクセサへのアクセスが可能となっています。次のような構文は等価となっています。 // setter [obj setObject:anObject]; obj.object = anObject; // getter id anObject = [obj object]; id anObject = obj.object; ドット構文を使うことにより、コードがより見やすくなると考えられます。しかしながら、ドット構文を私は使っていません。理由は主に3つあります。 第一に、Objective-C 2.0 は Leopard 以降なので、Leopard 以前を開発の対象とするならば、ド
Objective-C のメモリ管理やオブジェクトのオーナーシップは、Objective-Cを始めるプログラマにとって、少なからず理解に苦しむこともあるようですが、今回はある程度理解したプログラマ向けの、 retain と copy の使い分け方を書こうと思います。 実は、この retain と copy の使い分け方は、Cocoa基礎ガイドにも載っています。 copyとretainの使用面における違いは、前者の場合、新しい所有者による単独使用のためにオブジェクトが要求されることです。新しい所有者は、コピー元に関係なく、コピーしたオブジェクトを変異させることができます。通常、オブジェクトを保持するのではなくコピーするのは、オブジェクトが値オブジェクトの場合、つまり何らかのプリミティブな値をカプセル化している場合です。このことは、オブジェクトがNSMutableStringなどのように可変(
Xcode付属の、アプリケーションのさまざまなパフォーマンスを計測する Instruments というアプリケーションがありますが、今日メモリリークを確かめるために使ったら、優秀すぎて驚きました。以前はマシンスペック的に敬遠していたのですが、iMacになったので、Instruments をばんばん活用していきたいですね。今回は、メモリリークの調査が目的なので、Leaks と ObjectAlloc を計測してます。 ちなみに、 Xcodeでデバックするときに、パフォーマンスツールを使って実行をすれば、Instruments を立ち上げることができます。今回は、Leaks で立ち上げています。 このように、リアルタイムでリークを検出していき、グラフにしてくれます。とてもありがたいのが、Responsible の項目で、誰がどこでリークさせたかを教えてくれます。これを見ると、明らかに Pixi
CocoaにはNSDictionaryと呼ばれる、キーと値をペアにして配列にできるコレクションクラスがあります。いわゆる連想配列,辞書配列などと言わるやつです。CocoaのNSDictionaryのアクセスはこのようにやります。 id anObject = [dictionary objectForKey:@"key"]; //取得 [dictionary setValue:anObject forKey:@"key"]; //設定 キーには文字列以外も入ると思いますが、やったことがありません。それで、このメソッドどこかで見覚えないでしょうか?そう、これはキー値コーディングと全く同じアクセス方法なのです。ちなみに、キー値コーディングについては以前一度書いているので、そちらの記事をご覧下さい。(キー値コーディング) さて、キー値コーディングでNSDictionaryにアクセスできるということ
Concurrency Programming Guideをざっくりと読み終えました。やはりこのドキュメントはアプリケーションの最適化のカテゴリに入るだけあって、それほど重要視できるような内容に見えないドキュメントであると思います。しかし、Appleの選択はそうではなかったことは、Snow Leopard でお分かりいただけることだろうと思います。 Concurrency Programming Guide は、ドキュメントのタイトルの通り、並列プログラミングについて書かれているドキュメントです。既存のコードを並列化した方がよいかどうか、というところから、具体的にどのような場所に対して、どんな手法を使うえば良いかが書かれています。Grand Central Dispatch を活用したいと考えているプログラマは、よく読んでおきましょう。 また、ドキュメントには、既存のアプリケーションを並列
Cocoaには、他の開発環境では見かけない、いくつかのユニークな仕組みが用意されています。例えば、Key Value Coding(キー値コーディング),NSNotificationCenterなどがあげられますが、今回は既にたびたび出てきているNSAutoreleasePoolについて紹介します。 NSAutoreleasePoolは、名前からわかるように自動解放プールを作成するクラスです。自動解放プールとは至って単純な仕組みで、自動解放プールに登録されたオブジェクトは、自動解放プールを解放したときと同時に、登録されたオブジェクトも解放される仕組みです。正確には、登録されたオブジェクトにreleaseメッセージが送られます。 //プール作成 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //たくさんのオブジェクトを
Mac OS X Leopardでは、開発環境も大きく変わりました。Mac OS X標準のCocoaアプリケーションを作成する開発環境のXCode,GUIを設計するInterfaceBuilder、そして開発言語のObjective-Cすべてがメジャーバージョンアップされています。その中でも、特にInterface Builderの使い方が少なからず変わって、少し戸惑うところもあるので、Interface Builder2.0を使っていた人のための、Interface Builderの使い方を書こうと思います。 今回は、Interface Builderでコントローラーオブジェクトの作り方を説明します。ここでいうコントローラオブジェクトとは、MVC(Model-View-Controller)のControllerオブジェクトのことです。このあたりのワークフローが、特に旧Interface
動画にコメントを付けられるサービスで有名なニコニコ動画ですが、以前からコメントのデータには少々興味があり、分析してみると面白いのではないかと考えています。そのためには、まずコメントのデータをダウンロードしなければならないのですが、いろいろ調べた結果、HTTP通信で取得できることがわかりました。 具体的には、動画のURLを”http://www.nicovideo.jp/watch/sm******”とすると、まず、”http://www.nicovideo.jp/getflv?v=sm******”を開きます。すると、メッセージ用のスレッドIDとメッセージサーバーのURLを取得することができます。それぞれ、thread_idとmsの値がそれです。 次に、メッセージサーバーにHTTPリクエストをしますが、POSTメソッドを使用し、次のような書式のxmlを”http://msg**.nicov
このページを最初にブックマークしてみませんか?
『lifeaether.homeunix.net』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く