Dynamic Objective-C
定価:3,360円(本体3,200円+税)
仕様:448ページ/B5変型
発売日:2009年3月26日
マイコミジャーナルで3年半も連載していた「ダイナミックObjective-C」が、本になったよ。「Dynamic Objective-C」と、ちょっとだけタイトルが変わったぜ。いやー、正直この連載が本になるとは思わなかったね。
本の内容、というか連載の内容なんだけど、Objective-Cっていうプログラミング言語を徹底的に掘り下げた本だ。でも、この本はObjective-Cの入門書ではない。もっというと、Objective-Cの「使い方」を説明した本ではない。むしろ、Objective-Cの「作り方」を解説した、と言うのがいちばんしっくりくるかもしれない。
Objective-Cの言語としての特徴を並べると、オブジェクト指向、動的、メッセージング指向といったキーワードがある。これらがどういう意味を持っているのか、説明する事はできる。でも、それだけだと本当の理解にならないと思うんだよね。プログラミング言語は、道具だ。アプリケーションを作るための道具だ。いいアプリを作るには、道具を徹底的に使いこなさなくてはいけない。それには、ソースコードを読むのが一番だ!Objective-Cのランタイムのソースコードを読み解けば、さっきのObjective-Cの特徴が、もっと実践的に分かるんじゃないか?
それをやってしまったのが、この本だ。ランタイムのソースコード読んでるもんね。「オブジェクト指向における、多態性とはなにか?」って問われたら、「はい、ランタイムのファイルの、このソースの、ここのところで実現されてるものです!」って答えているから。ソースコード読むのが好きな人なら、きっと満足するはずだ。
そういや、「ダイナミックObjective-C」の連載始めるとき、タイトルどうする?って話を編集さんとしたんだけど、オブジェクト指向の実現の仕方をソースコードレベルから暴きだす、という意味で、「裸のオブジェクト指向」ってのを提案したなぁ。コメントももらえずに却下されたけど。本人は気に入っております。
他にも、Objective-CおよびCocoaをデザインパターンの文脈でとらえる、っていう試みもしている。また、本書のための書き下ろしとして、iPhoneのObjective-Cランタイムについても言及しているよ。
こんな特殊な本なんで、筆者が言うのもなんだけど、誰にでも勧められる物ではない。でも、面白いんだよ。他のどんなプログラミング言語の本よりも、知的好奇心がくすぐられると思う。
どんな人に読んでもらいたいのか、本書のはじめにある、対象読者の項を引用しておこう。ここに、本書のエッセンスと、私がソースコードを書くときに考えている事が凝縮されているよ。
本書はObjective-Cの入門書ではない。
Objective-Cを勉強するための教科書として本書を使う事は、勧められない。
本書はCocoaプログラミングの解説書でもない。
Cocoaアプリケーションを作成するためのガイドとして使う事も、勧められない。
本書が対象としているのは、すでにプログラミングを行っており、その背後にあるシステムに興味をかき立てられている方である。
どんなシステムでも、そこにはユーザがいて設計者がいる。
ユーザはそのシステムの恩恵だけを得ていてもいいのだが、その端々に設計者の思想が感じられるときがある。
その秘密を暴きたいとは思わないだろうか。
システムを理解するという事は、設計者の思考経路を再構築する事である。
その小径をたどる知の冒険に出たいとは思わないだろうか。
そのような方が、本書の対象である。
目次
Part I Objective-C
- 001 CocoaとObjective-Cと動的なオブジェクト指向 —Cocoaハックの第1歩
- 002 Objective-Cの動的型付け
- 003 Cocoa実現の肝 —クラスとそのメソッドの調査方法をチェック
- 004 ターゲット/アクションパラダイム(1) —動的特性を利用したデザインパターン
- 005 ターゲット/アクションパラダイム(2) —その利点を徹底検証
- 006 Cocoa-Javaの挑戦とは? —似て非なるセレクタとリフレクション
- 007 Objective-Cと様々な言語のブリッジ —PyObjC、RubyCocoa……
- 008 カテゴリ —動的なメソッドの追加によるクラスの拡張
- 009 プロトコルが必要とされた背景とは? —なぜあえて静的な型を?
- 010 非形式プロトコル —もう1つのプロトコル
- 011 2つのプロトコルの使い分け
- 012 ポージングで乗っ取り
- 013 Objective-Cのエンジン部 —ランタイムに踏み込む
- 014 クラスとは何か(1)—Mac OS X/Objective-Cにおけるクラスの実装を読む
- 015 クラスとは何か(2) —クラス情報に直接アクセスする
- 016 クラスとは何か(3) —メタクラスと親クラス
- 017 クラスとは何か(4) —Objective-Cにおけるオブジェクトとは何か?
- 018 メソッドとは何か(1) —メソッド、セレクタ、メソッドの実装
- 019 メソッドとは何か(2) —メソッドを取得する
- 020 メソッドとは何か(3) —メソッドの型を読み解く
- 021 メソッドとは何か(4) —セレクタの実体
- 022 メソッドとは何か(5) —メソッドの実装
- 023 メッセージ送信(1) —objc_msgSendの実装
- 024 メッセージ送信(2) —メソッドリストからメソッドを検索する
- 025 メッセージ送信(3) —メソッドのキャッシング
- 026 メッセージ送信(4) —メッセージ送信の流れと関数呼び出しとの違い
- 027 ランタイムAPIでさらに動的に(1) —動的なクラスの作成
- 028 ランタイムAPIでさらに動的に(2) —メソッドの追加
- 029 ランタイムAPIでさらに動的に(3) —メソッドの実装の置換
- 030 ランタイムAPIでさらに動的に(4) —インスタンス変数の定義を調査
- 031 ランタイムAPIでさらに動的に(5) —インスタンス変数に動的にアクセス
- 032 抽象クラスとクラスクラスタ
- 033 Core Foundation(1) —Core Foundation誕生前夜
- 034 Core Foundation(2) —C言語によるオブジェクト
- 035 Core Foundation(3) —クラスの定義
- 036 Core Foudation(4) —多態性の実現
- 037 Core Foudation(5) —インスタンスの実装
- 038 Toll-free bridge(1) —変換コスト0のブリッジ
- 039 Toll-free bridge(2) —Core Foundationのisaフィールド
- 040 Toll-free bridge(3) —Objective-Cメソッドの処理
- 041 インプットマネージャから侵入
- 042 SIMBLでハックを管理
- 043 AspectCocoa(1) —Objective-CとCocoaによるアスペクト指向
- 044 AspectCocoa(2) —IMPによるアスペクト指向の実現
- 045 AspectCocoa(3) —フォワーディングとポージングの利用
- 046 AspectCocoa(4) —AspectCocoaの実例
- 047 AspectCocoa(5) —インプットマネージャとの連携
- 048 F-Script —CocoaとObjective-Cのスクリプティング環境
- 049 ガベージコレクション(1) —GCのためのAPI
- 050 ガベージコレクション(2) —実体であるlibauto
- 051 ガベージコレクション(3) —保守的でありながらオブジェクト的
- 052 ガベージコレクション(4) —マーク・アンド・スイープ
- 053 ガベージコレクション(5) —コピーGCとコンパクション
- 054 プロパティ(1) —インスタンス変数のアクセス制御
- 055 プロパティ(2) —プロパティの宣言
- 056 プロパティ(3) —ドット演算子
- 057 プロパティ(4) —プロパティの属性
- 058 Fast Enumeration(1) —速い列挙子
- 059 Fast Enumeration(2) —NSFastEnumerationプロトコル
- 060 Fast Enumeration(3) —Fast Enumerationのソースコード
- 061 Fast Enumeration(4) —Fast Enumerationに対応するクラスの実装
Part II デザインパターン
- 062 デザインパターンで読み解くCocoa
- 063 Singleton(1)
- 064 Singleton(2)
- 065 Singleton(3)
- 066 Abstract Factory(1)
- 067 Abstract Factory(2)
- 068 Builder(1)
- 069 Builder(2)
- 070 Prototype(1)
- 071 Prototype(2)
- 072 Prototype(3)
- 073 Prototype(4)
- 074 Factory Method(1)
- 075 Factory Method(2)
- 076 Factory Method(3)
- 077 Factory Method(4)
- 078 Adapter(1)
- 079 Adapater(2)
- 080 Adapater(3)
- 081 Adapter(4)
- 082 Bridge(1)
- 083 Bridge(2)
- 084 Bridge(3)
- 085 Composite(1)
- 086 Composite(2)
- 087 Decorator(1)
- 088 Decorator(2)
- 089 Facade
- 090 Flyweight(1)
- 091 Flyweight(2)
- 092 Proxy(1)
- 093 Proxy(2)
- 094 Proxy(3)
- 095 Iterator(1)
- 096 Iterator(2)
- 097 Command(1)
- 098 Command(2)
- 099 Command(3)
- 100 Command(4)
- 101 Command(5)
- 102 Chain of Responsibility(1)
- 103 Chain of Responsibility(2)
- 104 Chain of Responsibility(3)
- 105 Chain of Responsibility(4)
- 106 Chain of Responsibility(5)
- 107 Memento(1)
- 108 Memento(2)
- 109 Observer(1)
- 110 Observer(2)
- 111 Observer(3)
- 112 Mediator(1)
- 113 Mediator(2)
- 114 Mediator(3)
- 115 Interpreter(1)
- 116 Interpreter(2)
- 117 State
- 118 Strategy
- 119 Template Method
- 120 Visitor(1)
- 121 Visitor(2)
Appendix Hack the iPhone
- Objective-C実行環境としてのiPhone
- iPhoneハックの是非
- iPhoneでランタイムAPIを使ってみる(1)
- iPhoneでランタイムAPIを使ってみる(2)