タグ

Objective-CとCocoaに関するagwのブックマーク (28)

  • 画像ファイルの保存方法

    保存すべき画像がNSImageクラスのインスタンスオブジェクトとして保持されているものとします。この画像をファイルとして保存する方法について説明します。 TIFFで保存する場合 NSImageは以下のメソッドを持っているため、TIFF形式のデータを得る事は簡単にできます。 - (NSData *)TIFFRepresentation NSDataのwriteToFile:atomically:メソッドを使えば、データを指定したパスにファイルとして書き込む事ができます。atomicallyをYESにしておくと、まず別の名前でファイルに書き込み、エラーが発生しなかった事を確認して指定されたファイル名に書き換えるという二つのステップを踏みます。こうすると書き込み中に何らかのエラーが起こった時に元のファイルを壊さずに済みます。 - (BOOL)writeToFile:(NSString *)pat

  • Technical Note TN2123: CrashReporter

    agw
    agw 2012/11/28
    便利関数。NSIntersectionRect等。
  • CompositeLab - Cocoa Break!

    agw
    agw 2012/11/27
    括弧の使い方がすごい。size = [(a = [[NSImage alloc] init]) size]とか。
  • プロトコル

    メソッドをクラス間で共有する プロトコルという用語は、比較的ネットワーク用語として利用されていますが、Objective-C に限っては、複数のクラスで実装される同一の名前のメソッドを共有するための、メソッドの宣言のことを指します。 Java 言語や C# 言語ではインタフェースと呼ばれる概念に近い存在です。 プロトコルが利用されるのは、プログラムの設計上の問題で、クラスが特定のメソッドを実装していることを保障するための手段として使われます。 例えば、特定のライブラリ仕様に基づいたクラスは指定したプロトコルに準拠させなければならない、といった関係を築くことができます。 プロトコルが提供するのは宣言されたメソッドだけで、メソッドの実装がどのような処理を実行するかは自由です。 プロトコルを宣言するには @protocol コンパイラディレクティブを用います。 この中で、プロトコルが規約として指

  • メソッドのポインタ Objective-C入門 WisdomSoft

    メソッドを関数として呼び出す 実は、Objective-C のメソッドの実態は C 言語の関数と同じです。 普段は隠蔽されていますが、メソッドとは最初の引数に自分のクラスを参照するオブジェクトを受け取る関数なのです。 メソッドの実体が関数であるという事実は、C 言語との親和性が極めて高いことを意味してます。 ピュアな C 言語で記述されたライブラリから Objective-C のメソッドを呼び出したり、オブジェクトを利用することも無理な話ではないのです。 Objective-C のメソッドは、常に IMP 型であると定義されます。 IMP 型は、ヘッダファイルで次のように定義されています。 typedef id (*IMP)(id, SEL, ...); この定義からも分かるように、Objective-C で宣言されたすべてのメソッドは、暗黙的に id 型と SEL 型の引数を持ちます。

    agw
    agw 2011/09/02
    instanceMethodFor/methodForとあるが...?
  • Objective-Cのクラス定義を理解しよう

    Objective-Cのクラス定義を理解しよう:Cocoaの素、Objective-Cを知ろう(3)(1/3 ページ) iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基を理解しよう(編集部) 前回の「一番初めのObjective-Cプログラム」では、シンプルなサンプルプログラムに沿って、クラス定義の最低限のルールを解説しました。 今回からは、プログラムの構成要素の1つ1つをより深く掘り下げていきたいと思います。その手始めとして、まずはオブジェクト指向の中核であるクラスの定義方法について解説します。前回までの解説と多少重複する部分もありますが、クラスに含まれる構成要素について、より詳しく見ていくことにしましょう。 なお、今回のサンプルは、説明やファイル作成を簡単にするために、クラスの宣言、クラスの実装、および

    Objective-Cのクラス定義を理解しよう
  • こたつつきみかん » なぜ Objective-C は気持ち悪いのか – クラス編

    なぜ Objective-C は気持ち悪いのか分析してみる企画。前回はコードの見た目について考えましたが、今回はクラスについて考えてみます。 動的な生成のみ Objective-C は、静的なインスタンスを生成することはできず、必ず動的なインスタンスを生成しなければなりません。常にポインタで扱うことになるので、高速な反面、メモリ管理の煩わしさが常につきまといます。通常、インスタンスの生成、破棄は次のようにします。 id object = [[NSObject alloc] init]; [object release]; NSObject に対して alloc メッセージを送り、インスタンスのメモリ領域を生成します。そのあとに、それに init メッセージを適用し、インスタンスを初期化します。ほとんどの場合、alloc, init はペアにして実行します。なぜなら、alloc しても in

  • こたつつきみかん » なぜ Objective-C は気持ち悪いのか – 見た目編

    iPhone OS 向けのアプリケーション開発で注目を浴びている Objective-C 言語ですが、Objective-C についてあまりいい噂を耳にしないので、なぜそうなってしまうのかという分析をしてみることにしました。記事が長くなりそうだったので、今回は見た目編です。 1. 見た目 プログラミング言語において、見た目というものは重要な要素のひとつです。Objective-C 言語はオブジェクト指向言語でありますが、実際のコードをみてみると、ほかのメジャーな言語とはちょっと違った構文がとられています。 メッセージ式 Objective-C では、メソッド呼び出しをメッセージ式で記述します。以下は、anObject に message というメッセージを送る例です。 [anObject message]; [anObject message:arg1]; [anObject messag

  • こたつつきみかん : Objective-Cのメモリ管理

    Objective-C のメモリ管理の話をします。Objective-C ではどのようなルールに基づいてコーディングすればよいかを説明します。 alloc, copy, new を送信したオブジェクトは、それによって生成されたオブジェクトを所有します。また、retain を送信したオブジェクトは、その受信側のオブジェクトを所有します。 所有しているオブジェクトが不要になったら、そのオブジェクトに release メッセージを送信して、所有を放棄しなければなりません。 所有してないオブジェクトに release メッセージを送信して、そのオブジェクトを放棄しようとしてはいけません。 補足して、次のようなことも頭に入れておきましょう。 誰もオブジェクトを所有しなくなったとき、そのオブジェクトには dealloc メッセージが送信され、そのあとメモリから解放されます。 あるオブジェクトを複数のオ

  • こたつつきみかん » NSPredicate の使い方

    NSPredicate の話を求めて、このブログへ訪れる方が多いようなので、NSPredicate の使い方を紹介しようと思います。 NSPredicate は、NSArray で要素をフィルターするための条件を表したり、Core Data で取ってくるデータの条件を表すためのクラスです。 NSPredicate を作成する方法として最も簡単なものが、predicateWithFormat です。これを用いると、NSPredicate 独自の記法ではありますが、自然な記述で条件を書くことができます。 Predicate の条件式の基形は、”keyPath operator literal” です。それぞれには、次のようなものが入ります。 keyPath キー値コーディングのキーパス。この値が条件の判定に利用されます。self 指定すると、そのオブジェクト自体の値が利用されます。(self

  • 【コラム】ダイナミックObjective-C (115) デザインパターンをObjective-Cで - Interpreter (1) | エンタープライズ | マイコミジャーナル

    Objective-CとCocoaの立場から、デザインパターンを眺めてみるこの取り組みも、いよいよ佳境に入ってきた。残すところ数パターンとなってきた。だが、まだまだクセの強いパターンが残っている。 今回からは、Interpreterパターンを取り上げよう。文法や言語を読み込むために使われるパターンだ。 Interpreterパターンとは Interpreterパターンは、その名の通り、インタプリタと考えてしまえばいいだろう。インタプリタは、計算機の処理系の一種で、プログラミング言語などを読み込みながら処理するものだ。たとえば、BASICインタプリタや、Perlインタプリタなどがある。 このインタプリタのためのパターンが、Interpreterパターンだ。インタプリタそのものをデザインパターンにしてしまうとは、なかなか大胆な発想だ。 Interpreterパターンでは、文法規則の1つ1つをク

  • 【コラム】ダイナミックObjective-C (116) デザインパターンをObjective-Cで - Interpreter (2) | エンタープライズ | マイコミジャーナル

    Interpreterデザインパターンは、非常にプログラミング言語よりのパターンだ。自分で、新しくて、それでいながら簡易なプログラミング言語をデザインするときに使う事になるだろう。それ以外の場合は、なかなかお目にかかれないパターンだ。 Cocoaにそのようなパターンを使っているクラスがあるのだろうか? 実は、ピッタリのものがある。それは、Core Dataで使われている、オブジェクトを抽出するための文法だ。 Cocoa Predicates Core Dataは、MVCアーキテクチャでいうと、モデルをサポートするものとなる。モデルクラスの作成を強力にバックアプする。クラスのモデリングのための専用ツールを用意し、データの永続性をほぼ完全に実現している。 Core Dataは、その出自にEnterprise Objects Framework (EOF)の技術がある。EOFもCocoaと並んで

  • Why not start convenience constructors with "with"?

  • Objective-C 2.0 ランタイムの情報

    MacOSXプログラミング。毎日更新。 話題: Cocoa, Objective-C, Snow Leopard 以前の投稿のコメントで Objective-C 2.0 になってからランタイムのインターフェイスが大幅に変更されたとの情報をもらった(有益な情報どうも)。 Cocoaの日々: Safari用独自プラグインを作る(2) - Posing と Method Swizzling (下の方にコメントがある) runtime.h にあった OBJC2_UNAVAILABLE というラベルは 2.0 ランタイム以降では使えないことを示すらしい(ただし互換性のために残してある)。 runtime.h struct objc_method { SEL method_name OBJC2_UNAVAILABLE; char *method_types OBJC2_UNAVAILABLE; IMP

    Objective-C 2.0 ランタイムの情報
  • 【コラム】ダイナミックObjective-C (22) メソッドとは何か(5) - メソッドの実装 | エンタープライズ | マイコミジャーナル

    メソッドを構成する要素の最後になる、メソッドの実装を取り上げよう。IMP (implementation) 型になる。これを利用すると、劇的な高速化も可能だ。 IMP型の定義 メソッドの実装を表すIMP型について、前にも紹介したが、もう一度説明しよう。メソッドを表す構造体は、Method構造体。この中にmethod_impという名前の、IMP型のフィールドがある。このIMP型の定義は、objc.hにある。 objc.h typedef id (*IMP)(id, SEL, ...); つまり、C言語の関数である。Objective-Cでは、メソッドの実際の処理を行っている実装はどこにあるのかと、追いかけていけば、このC関数にたどり着く。 この関数には、2つの引数があらかじめ定義されてある。これが、前々回に紹介した、メソッドに渡される暗黙の変数だ。すべてのメソッドで、この変数を利用できる。

    agw
    agw 2011/06/03
    IMPの取得方法について。
  • http://cocoadevcentral.com/

  • 【コラム】ダイナミックObjective-C (12) ポージングで乗っ取り | エンタープライズ | マイコミジャーナル

    クラスの乗っ取り Objective-Cには、ポージングという機能がある。これは、一言でいうと、既存のクラスを「乗っ取る」ことができる機能だ。すでにあるクラスを、強引に自分のクラスで置き換えてしまう。 ポージングは、poseAsClass:というメソッドで行う。このメソッドが呼ばれたクラスは、引数で渡されたクラスのように振る舞うことになる。これは、具体的な例を見てもらうのが早いだろう。 例として、Cocoaでウィンドウを表すクラスであるNSWindowを継承した、TransparentWindowというクラスを作ってみた。クラスがランタイムに読み込まれたときに呼ばれる、loadメソッドの中で、poseAsClass:を呼んでいる。 // TransparentWindowクラスの宣言 @interface TransparentWindow : NSWindow {} @end /

  • 【コラム】ダイナミックObjective-C (11) 2つのプロトコルの使い分け | エンタープライズ | マイコミジャーナル

    前回は非形式プロトコルの説明をして、デリゲートでよく使われるという話をした。今回は、形式プロトコルと非形式プロトコルの違いを追求してみよう。 非形式プロトコルに対する、形式プロトコルの利点は、次の2つにある。 メソッドの実装をチェックして、コンパイル時に警告を出す conformsToProtocol:を使って、プロトコル準拠を調べることができる デリゲートに、この利点が有効かどうか、説明しよう。 デリゲートの設定はInterface Builderで Objective-Cを利用しているフレームワークであるCocoaでは、とても多くのクラスがデリゲート機能を提供している。特に、モデル・ビュー・コントローラ構造の、ビューにあたるクラスでは、基的な動作の制御は、すべてデリゲートを通して行われる。フレームワークの設計の指針として、クラスの拡張は、できる限りデリゲートで行い、サブクラス化をなる

  • 【コラム】ダイナミックObjective-C (10) 非形式プロトコル - もう1つのプロトコル | エンタープライズ | マイコミジャーナル

    前回は、Objective-Cのプロトコルについて説明したが、その利点としてプロセス間通信の抑制という点を挙げた。だが、プロトコルは、もう一つの側面である「オブジェクトの振る舞いを表すメソッドの集合」をするもの、という文脈で語られることが多い。この説明を後回しにしたのは、この機能は「もう1つのプロトコル」で実現されることが多いからだ。今回は、このことを説明しよう。 非形式プロトコル 前回説明したように、プロトコルは「@protocol」という、特別な文法を導入している。だが、メソッドの集合を宣言するだけなれば、わざわざ新しい文法を使う必要はない。カテゴリを使えばよい。ただし、ちょっとコツがいる。Objective-Cのルートクラスである、NSObjectのカテゴリとして宣言するのだ。 実際の例を紹介しよう。Cocoaでは、テーブルビューを表示するために、NSTableViewというクラスが

  • 【コラム】ダイナミックObjective-C (9) プロトコルが必要とされた背景とは? - なぜあえて静的な型を? | エンタープライズ | マイコミジャーナル

    前回と同様、Objective-Cでのメソッド宣言にまつわる話を続けよう。今回は、メソッドの集合を宣言するプロトコルだ。 プロトコルによるメソッドの集合の宣言 プロトコルは、オブジェクトの振る舞いを表すメソッドの集合を定義するものだ。@protocolという指示子で宣言する。 具体的な例を見てみよう。次のコードは、NSCodingというプロトコルを宣言するものだ。これは、オブジェクトをエンコード、デコードするためのメソッドを定義する。この2つのメソッドで、オブジェクトの保存/読み込み機能を実装する。 @protocol NSCoding - (void)encodeWithCoder:(NSCoder*)coder; - (id)initWithCoder:(NSCoder*)decoder; @end オブジェクトがこのプロトコルを採用することを、プロトコルに適合している、という。