Dynamic Objective-C

HMDT Logic and Intuition
ISBN:978-4-86100-641-8
定価: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)