Objective-Cプログラミング言語 (TP30001163 6.1)



Similar documents
1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

01_07_01 データのインポート_エクスポート_1

(1)1オールゼロ 記 録 ケース 厚 生 年 金 期 間 A B 及 びCに 係 る 旧 厚 生 年 金 保 険 法 の 老 齢 年 金 ( 以 下 旧 厚 老 という )の 受 給 者 に 時 効 特 例 法 施 行 後 厚 生 年 金 期 間 Dが 判 明 した Bは 事 業 所 記 号 が

<4D F736F F D2091E F18CB48D C481698E7B90DD8F9590AC89DB816A2E646F63>

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

ていることから それに 先 行 する 形 で 下 請 業 者 についても 対 策 を 講 じることとしまし た 本 県 としましては それまでの 間 に 未 加 入 の 建 設 業 者 に 加 入 していただきますよう 28 年 4 月 から 実 施 することとしました 問 6 公 共 工 事 の

<4D F736F F D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A B E A2E646F63>

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合

2 役 員 の 報 酬 等 の 支 給 状 況 平 成 27 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 役 名 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 2,142 ( 地 域 手 当 ) 17,205 11,580 3,311 4 月 1

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

平成21年9月29日

1

2 県 公 立 高 校 の 合 格 者 は このように 決 まる (1) 選 抜 の 仕 組 み 選 抜 の 資 料 選 抜 の 資 料 は 主 に 下 記 の3つがあり 全 高 校 で 使 用 する 共 通 の ものと 高 校 ごとに 決 めるものとがあります 1 学 力 検 査 ( 国 語 数

計算式の取り扱い


Microsݯft Word - 91 forܠ2009November.docx

PowerPoint プレゼンテーション

答申第585号

の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編

Taro-H19退職金(修正版).jtd

Microsoft Word - 佐野市生活排水処理構想(案).doc

PowerPoint プレゼンテーション

特別徴収封入送付作業について

Microsoft PowerPoint - 報告書(概要).ppt

<819A955D89BF92B28F BC690ED97AA8EBA81418FA48BC682CC8A8890AB89BB816A32322E786C7378>

< DB8CAF97BF97A6955C2E786C73>

2. ど の 様 な 経 緯 で 発 覚 し た の か ま た 遡 っ た の を 昨 年 4 月 ま で と し た の は 何 故 か 明 ら か に す る こ と 回 答 3 月 17 日 に 実 施 し た ダ イ ヤ 改 正 で 静 岡 車 両 区 の 構 内 運 転 が 静 岡 運

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

・モニター広告運営事業仕様書

電子申告直前研修会(所得税編)

景品の換金行為と「三店方式」について


労働時間と休日は、労働条件のもっとも基本的なものの一つです

「1 所得税及び復興特別所得税の確定申告書データをお持ちの方」からの更正の請求書・修正申告書作成編

検 討 検 討 の 進 め 方 検 討 状 況 簡 易 収 支 の 世 帯 からサンプリング 世 帯 名 作 成 事 務 の 廃 止 4 5 必 要 な 世 帯 数 の 確 保 が 可 能 か 簡 易 収 支 を 実 施 している 民 間 事 業 者 との 連 絡 等 に 伴 う 事 務 の 複 雑

[2] 控 除 限 度 額 繰 越 欠 損 金 を 有 する 法 人 において 欠 損 金 発 生 事 業 年 度 の 翌 事 業 年 度 以 後 の 欠 損 金 の 繰 越 控 除 にあ たっては 平 成 27 年 度 税 制 改 正 により 次 ページ 以 降 で 解 説 する の 特 例 (

Microsoft Word - 【溶け込み】【修正】第2章~第4章

Speed突破!Premium問題集 基本書サンプル

2 一 般 行 政 職 給 料 表 の 状 況 ( 平 成 2 年 月 1 日 現 在 ) 1 号 給 の 給 料 月 額 最 高 号 給 の 給 料 月 額 ( 注 ) 給 料 月 額 は 給 与 抑 制 措 置 を 行 う 前 のものです ( 単 位 : ) 3 職 員 の 平 均 給 与 月

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

平成25年度 独立行政法人日本学生支援機構の役職員の報酬・給与等について

2. 会 計 規 程 の 業 務 (1) 規 程 と 実 際 の 業 務 の 調 査 規 程 や 運 用 方 針 に 規 定 されている 業 務 ( 帳 票 )が 実 際 に 行 われているか( 作 成 されている か)どうかについて 調 べてみた 以 下 の 表 は 規 程 の 条 項 とそこに

Taro-2220(修正).jtd

目 次 1. 論 理 関 数 IF IF の 概 要 論 理 式 の 種 類 等 号 不 等 号 具 体 的 な 使 い 方 ネスト 複 数 の 条 件 を 記 述...

3. 選 任 固 定 資 産 評 価 員 は 固 定 資 産 の 評 価 に 関 する 知 識 及 び 経 験 を 有 する 者 のうちから 市 町 村 長 が 当 該 市 町 村 の 議 会 の 同 意 を 得 て 選 任 する 二 以 上 の 市 町 村 の 長 は 当 該 市 町 村 の 議

積 載 せず かつ 燃 料 冷 却 水 及 び 潤 滑 油 の 全 量 を 搭 載 し 自 動 車 製 作 者 が 定 める 工 具 及 び 付 属 品 (スペアタイヤを 含 む )を 全 て 装 備 した 状 態 をいう この 場 合 に おいて 燃 料 の 全 量 を 搭 載 するとは 燃 料

資 格 給 付 関 係 ( 問 1) 外 国 人 Aさん(76 歳 )は 在 留 期 間 が3ヶ 月 であることから 長 寿 医 療 の 被 保 険 者 ではない が 在 留 資 格 の 変 更 又 は 在 留 期 間 の 伸 長 により 長 寿 医 療 の 適 用 対 象 となる 場 合 には 国

22 第 1 章 資 本 金 等 利 益 積 立 金 貴 見 のとおり 資 本 等 取 引 は 本 来 は 増 資 とか 減 資 と か さらには 旧 資 本 積 立 金 額 の 増 加 または 減 少 をいうこと になる ただ 利 益 の 配 当 はいわゆる 資 本 金 等 取 引 である か 損

H28記入説明書(納付金・調整金)8

鳥 取 国 民 年 金 事 案 177 第 1 委 員 会 の 結 論 申 立 人 の 昭 和 37 年 6 月 から 38 年 3 月 までの 国 民 年 金 保 険 料 については 納 付 していたものと 認 められることから 納 付 記 録 を 訂 正 することが 必 要 である 第 2 申

Microsoft Word - 第3章.doc

4 承 認 コミュニティ 組 織 は 市 長 若 しくはその 委 任 を 受 けた 者 又 は 監 査 委 員 の 監 査 に 応 じなければ ならない ( 状 況 報 告 ) 第 7 条 承 認 コミュニティ 組 織 は 市 長 が 必 要 と 認 めるときは 交 付 金 事 業 の 遂 行 の

Ⅰ 調 査 の 概 要 1 目 的 義 務 教 育 の 機 会 均 等 その 水 準 の 維 持 向 上 の 観 点 から 的 な 児 童 生 徒 の 学 力 や 学 習 状 況 を 把 握 分 析 し 教 育 施 策 の 成 果 課 題 を 検 証 し その 改 善 を 図 るもに 学 校 におけ

目 次 1. Web メールのご 利 用 について Web メール 画 面 のフロー 図 Web メールへのアクセス ログイン 画 面 ログイン 後 (メール 一 覧 画 面 ) 画 面 共 通 項 目

第1回

<4D F736F F D E598BC68A8897CD82CC8DC490B68B7982D18E598BC68A8893AE82CC8A C98AD682B782E993C195CA915B C98AEE82C382AD936F985E96C68B9690C582CC93C197E1915B927582CC898492B75F8E96914F955D89BF8F915F2E646F6

ことばを覚える

通 知 カード と 個 人 番 号 カード の 違 い 2 通 知 カード ( 紙 )/H27.10 個 人 番 号 カード (ICカード)/H28.1 様 式 (おもて) (うら) 作 成 交 付 主 な 記 載 事 項 全 国 ( 外 国 人 含 む)に 郵 送 で 配 布 希 望 者 に 交

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合

1-2 新 規 CPD 会 員 登 録 の 申 請 から 登 録 までの 手 順 当 協 会 CPDシステムを 利 用 するためには 当 協 会 ホームページトップ 画 面 より CPD 事 務 局 へ のCPD 会 員 登 録 が 必 要 です CPD 会 員 登 録 が 完 了 すると 登 録

<4D F736F F D AC90D1955D92E CC82CC895E DD8C D2816A2E646F63>

R4財務対応障害一覧

Box-Jenkinsの方法

入 札 参 加 資 格 申 請 システム 操 作 マニュアル 入 札 参 加 資 格 の 資 格 有 効 ( 変 更 ) 日 を 迎 えると 追 加 届 の 登 録 ができるようになります ( 入 札 参 加 資 格 申 請 の 定 時 受 付 では いずれかの 申 請 先 団 体 から 入 札 参

中 間 利 払 日 とし 預 入 日 または 前 回 の 中 間 利 払 日 からその 中 間 利 払 日 の 前 日 までの 日 数 および 通 帳 または 証 書 記 載 の 中 間 利 払 利 率 によって 計 算 した 中 間 利 払 額 ( 以 下 中 間 払 利 息 といいます )を 利

経 理 上 くん db(version 8.001)の 変 更 点 概 要 Ⅰ. 消 費 税 /リバースチャージ 方 式 の 申 告 に 対 応 1 特 定 課 税 仕 入 特 定 課 税 仕 入 返 還 区 分 を 追 加 しました Ⅱ.その 他 の 改 良 修 正 詳 細 は 後 述 を 参 照

0 目 次 1. 畑 のあしあとの 使 い 方 P.3 2.オプション P.6 3.モバイルデバイスより 履 歴 取 得 P.8 4. 基 本 情 報 管 理 P 栽 培 計 画 P.22 6.ドキュメント 出 力 P 栽 培 履 歴 管 理 P.28 8.モバイルでの 栽

<4D F736F F D C93FA967B91E5906B8DD082D682CC91CE899E2E646F6378>

4 参 加 資 格 要 件 本 提 案 への 参 加 予 定 者 は 以 下 の 条 件 を 全 て 満 たすこと 1 地 方 自 治 法 施 行 令 ( 昭 和 22 年 政 令 第 16 号 ) 第 167 条 の4 第 1 項 各 号 の 規 定 に 該 当 しない 者 であること 2 会 社

った 場 合 など 監 事 の 任 務 懈 怠 の 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 減 算 する (8) 役 員 の 法 人 に 対 する 特 段 の 貢 献 が 認 められる 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 加 算 することができる

新 生産管理システム ご提案書 2002年10月15日 ムラテック情報システム株式会社

Microsoft Word - ★HP版平成27年度検査の結果

目 次 1 個 人 基 本 情 報 個 人 基 本 情 報 入 力 画 面 の 分 散 4 申 告 区 分 および 申 告 種 類 の 選 択 方 法 5 繰 越 損 失 入 力 年 別 の 繰 越 損 失 額 入 力 に 対 応 6 作 成 手 順 作 成 手 順 の 流 れを 提 供 7 所 得

返還同意書作成支援 操作説明書

参 考 様 式 再 就 者 から 依 頼 等 を 受 けた 場 合 の 届 出 公 平 委 員 会 委 員 長 様 年 月 日 地 方 公 務 員 法 ( 昭 和 25 年 法 律 第 261 号 ) 第 38 条 の2 第 7 項 規 定 に 基 づき 下 記 のとおり 届 出 を します この

も く じ 1 税 源 移 譲 1 2 何 が 変 わったのか 改 正 の 3 つ の ポイント ポイント1 国 から 地 方 へ 3 兆 円 規 模 の 税 源 が 移 譲 される 2 ポイント2 個 人 住 民 税 の 税 率 構 造 が 一 律 10%に 変 わる 3 ポイント3 個 々の 納

税金読本(8-5)特定口座と確定申告

二 資本金の管理

私立大学等研究設備整備費等補助金(私立大学等

<4D F736F F D F93878CA797708F4390B3816A819A95CA8B4C976C8EAE91E682538B4C8DDA97E12E646F6378>

Q IFRSの特徴について教えてください

接続試験実施要領【障害者総合支援法(平成27年4月報酬改定)対応】

注 雇 促 進 税 制 と 本 制 度 のどちらかを 利 する 可 能 性 があるが あらかじめどちらの 制 度 を 利 するか 判 断 できない という 場 合 雇 促 進 税 制 の 事 前 届 出 ( 雇 促 進 計 画 の 提 出 )をした 上 で 申 告 の 際 にどちらを 利 するかご

就 業 規 則 ( 福 利 厚 生 ) 第 章 福 利 厚 生 ( 死 亡 弔 慰 金 等 ) 第 条 法 人 が 群 馬 県 社 会 福 祉 協 議 会 民 間 社 会 福 祉 施 設 等 職 員 共 済 規 程 に 基 づき 群 馬 県 社 会 福 祉 協 議 会 との 間 において 締 結 す

●電力自由化推進法案

第2回 制度設計専門会合 事務局提出資料

一 覧 表 ( 専 従 者 用 ) YES NOチャート( 専 従 月 額 単 価 用 ) (P.4)を 参 考 にしてください < 直 接 雇 用 者 > 一 覧 表 ( 専 従 者 用 )の 単 価 は 委 託 期 間 中 に 継 続 して 半 年 以 上 当 該 AMED 事 業

している 5. これに 対 して 親 会 社 の 持 分 変 動 による 差 額 を 資 本 剰 余 金 として 処 理 した 結 果 資 本 剰 余 金 残 高 が 負 の 値 となるような 場 合 の 取 扱 いの 明 確 化 を 求 めるコメントが 複 数 寄 せられた 6. コメントでは 親

<4D F736F F D208CA990CF96BE8DD78F918EAE82CC95CF8D >

職 員 の 平 均 給 与 月 額 初 任 給 等 の 状 況 (1) 職 員 の 平 均 年 齢 平 均 給 料 月 額 及 び 平 均 給 与 月 額 の 状 況 ( 平 成 年 月 1 日 現 在 ) 1 一 般 行 政 職 福 岡 県 技 能 労 務 職 歳 1,19,98 9,9 歳 8,

説 明 内 容 料 金 の 算 定 期 間 と 請 求 の 単 位 について 分 散 検 針 制 日 程 等 別 料 金 料 金 の 算 定 期 間 と 支 払 義 務 発 生 日 日 程 等 別 料 金 の 請 求 スケジュール 料 金 のお 支 払 い 方 法 その 他 各 種 料 金 支 払

(1) 率 等 一 覧 ( 平 成 26 年 度 ) 目 課 客 体 及 び 納 義 務 者 課 標 準 及 び 率 法 内 に 住 所 を 有 する ( 均 等 割 所 得 割 ) 内 に 事 務 所 事 業 所 又 は 家 屋 敷 を 有 する で 内 に 住 所 を 有 し ないもの( 均 等

平成22年度

(2) 単 身 者 向 け 以 外 の 賃 貸 共 同 住 宅 等 当 該 建 物 に 対 して 新 たに 固 定 資 産 税 等 が 課 税 される 年 から 起 算 して5 年 間 とする ( 交 付 申 請 及 び 決 定 ) 第 5 条 補 助 金 の 交 付 を 受 けようとする 者 は

加 算 税 制 度 の 見 直 し 等 1. 現 行 制 度 の 概 要 関 税 においては 国 税 ( 輸 入 貨 物 に 対 する 内 国 消 費 税 を 含 む 以 下 同 じ ) の 制 度 と 同 様 の 過 少 申 告 加 算 税 無 申 告 加 算 税 及 び 重 加 算 税 の 制

2 課 題 管 理 ( 科 学 研 究 費 補 助 金 ) 画 面 が 表 示 されます 補 助 事 業 期 間 終 了 後 欄 の[ 入 力 ] をクリックします [ 入 力 ]ボタンが 表 示 されていない 場 合 には 所 属 する 研 究 機 関 の 事 務 局 等 へお 問 い 合 わせく

製 造 業 者 は 製 造 販 売 業 者 の 管 理 監 督 の 下 適 切 な 品 質 管 理 を 行 い 製 品 を 製 造 します なお 製 造 業 は 製 造 に 特 化 した 許 可 となっており 製 造 業 の 許 可 のみでは 製 品 を 市 場 に 出 荷 することはできま せん

Transcription:

Objective-C プログラミング 言 語

目 次 はじめに 7 対 象 読 者 7 この 書 類 の 構 成 8 表 記 規 則 8 関 連 項 目 9 ランタイムシステム 9 メモリ 管 理 9 オブジェクト クラス メッセージ 10 ランタイムシステム 10 オブジェクト 10 オブジェクトの 基 礎 10 id 11 動 的 型 定 義 12 メモリ 管 理 12 オブジェクトメッセージング 13 メッセージの 構 文 13 nilへのメッセージ 送 信 15 レシーバのインスタンス 変 数 16 ポリモーフィズム( 多 態 性 ) 17 動 的 バインディング 17 動 的 メソッド 解 決 18 ドット 構 文 18 クラス 19 継 承 20 クラスの 型 24 クラスオブジェクト 26 ソースコードにおけるクラス 名 33 クラスの 等 価 性 のテスト 34 クラスの 定 義 35 ソースファイル 35 クラスインターフェイス 36 インターフェイスのインポート 38 2

目 次 ほかのクラスの 参 照 39 インターフェイスの 役 割 40 クラス 実 装 40 インスタンス 変 数 の 参 照 42 インスタンス 変 数 の 有 効 範 囲 43 selfとsuperに 対 するメッセージ 46 例 :selfとsuperの 使 用 47 superの 使 用 50 selfの 再 定 義 51 プロトコル 53 ほかのクラスが 実 装 できるインターフェイスの 宣 言 53 ほかのクラスが 実 装 するメソッド 54 匿 名 オブジェクトのインターフェイスの 宣 言 55 非 階 層 的 な 類 似 性 57 形 式 プロトコル 58 プロトコルの 宣 言 58 任 意 のプロトコルメソッド 58 非 形 式 プロトコル 59 Protocolオブジェクト 60 プロトコルの 採 用 61 プロトコルへの 準 拠 62 型 チェック 62 プロトコル 内 のプロトコル 63 ほかのプロトコルの 参 照 65 宣 言 済 みプロパティ 67 概 要 67 プロパティの 宣 言 と 実 装 67 プロパティの 宣 言 67 プロパティ 宣 言 属 性 69 プロパティの 実 装 ディレクティブ 72 プロパティの 使 用 74 サポートされる 型 74 プロパティの 再 宣 言 74 Core Foundation 75 プロパティを 使 ったサブクラス 化 76 ランタイムの 相 違 76 カテゴリと 拡 張 78 3

目 次 メソッドのクラスへの 追 加 78 拡 張 79 関 連 参 照 81 関 連 の 作 成 81 関 連 先 のオブジェクトの 取 得 82 関 連 の 解 消 82 完 全 な 例 83 高 速 列 挙 85 for in 構 文 85 高 速 列 挙 の 採 用 86 高 速 列 挙 の 使 用 86 静 的 な 動 作 の 実 現 88 デフォルトの 動 的 動 作 88 静 的 な 型 定 義 89 型 チェック 90 戻 り 型 とパラメータ 型 91 継 承 元 クラスへの 静 的 な 型 定 義 91 セレクタ 93 メソッドとセレクタ 93 SELと@selector 93 メソッドとセレクタ 94 メソッドの 戻 り 型 とパラメータ 型 94 実 行 時 のメッセージ 変 更 94 ターゲット/アクションデザインパターン 95 メッセージングエラーの 回 避 96 例 外 処 理 98 例 外 処 理 の 有 効 化 98 例 外 処 理 98 異 なるタイプの 例 外 のキャッチ 99 例 外 のスロー 100 スレッド 化 102 書 類 の 改 訂 履 歴 104 4

目 次 用 語 解 説 108 5

図 リスト オブジェクト クラス メッセージ 10 図 1-1 ドロープログラムのクラス 20 図 1-2 Rectangleのインスタンス 変 数 22 図 1-3 NSCellの 継 承 階 層 29 リスト 1-1 initializeメソッドの 実 装 32 クラスの 定 義 35 図 2-1 インスタンス 変 数 の 有 効 範 囲 (@packageは 図 示 していません) 44 図 2-2 High Mid Lowの 階 層 48 宣 言 済 みプロパティ 67 リスト 4-1 簡 単 なプロパティの 宣 言 68 リスト 4-2 @synthesizeの 使 用 72 リスト 4-3 NSManagedObjectでの@dynamicの 使 用 73 関 連 参 照 81 リスト 6-1 配 列 と 文 字 列 の 間 の 関 連 の 作 成 81 例 外 処 理 98 リスト 10-1 例 外 ハンドラ 99 スレッド 化 102 リスト 11-1 selfを 使 ってメソッドをロックする 102 リスト 11-2 カスタムセマフォを 使 ってメソッドをロックする 103 6

はじめに Objective-C 言 語 は 高 度 なオブジェクト 指 向 プログラミングを 可 能 にするために 設 計 された 簡 単 なコ ンピュータプログラミング 言 語 です Objective-Cは 小 規 模 でも 強 力 な 標 準 のANSI C 言 語 の 拡 張 セッ トとして 定 義 されます C 言 語 への 追 加 部 分 のほとんどは 初 期 のオブジェクト 指 向 言 語 の1つである Smalltalkに 基 づいています Objective-Cは C 言 語 に 完 全 なオブジェクト 指 向 プログラミング 機 能 を 分 かりやすい 形 で 追 加 することを 意 図 して 設 計 されています ほとんどのオブジェクト 指 向 開 発 環 境 は いくつかの 部 分 から 成 ります オブジェクト 指 向 プログラミング 言 語 オブジェクトのライブラリ 開 発 ツールスイート ランタイム 環 境 この 文 書 は 開 発 環 境 の 第 1の 要 素 つまりプログラミング 言 語 に 関 するものです また 第 2の 要 素 であるObjective-Cのアプリケーションフレームワーク( 総 称 して Cocoa と 呼 びます)について 学 ぶ ための 基 礎 についても 説 明 しています ランタイム 環 境 については 別 の 文 書 の Objective-CRuntime Programming Guide で 説 明 しています 対 象 読 者 この 文 書 は 次 のことに 興 味 のある 読 者 を 対 象 としています Objective-Cによるプログラミング Cocoaアプリケーションフレームワークの 基 礎 知 識 この 文 書 では Objective-Cの 基 盤 であるオブジェクト 指 向 モデルの 紹 介 と 言 語 の 完 全 な 解 説 を 行 い ます C 言 語 に 対 するObjective-Cの 拡 張 に 焦 点 をあて C 言 語 そのものの 説 明 は 省 きます この 文 書 はC 言 語 については 解 説 されていないため C 言 語 にある 程 度 慣 れていることが 前 提 となりま す Objective-Cによるオブジェクト 指 向 プログラミングはANSI Cの 手 続 き 型 プログラミングとはかな り 違 っているので 熟 達 したCプログラマでなくても さほど 不 利 にはなりません 7

はじめに この 書 類 の 構 成 この 書 類 の 構 成 次 の 各 章 で 標 準 C 言 語 に 対 してObjective-C 言 語 によって 加 えられたすべての 機 能 を 取 り 上 げます オブジェクト クラス メッセージ (10 ページ) クラスの 定 義 (35 ページ) プロトコル (53 ページ) 宣 言 済 みプロパティ (67 ページ) カテゴリと 拡 張 (78 ページ) 関 連 参 照 (81 ページ) 高 速 列 挙 (85 ページ) 静 的 な 動 作 の 実 現 (88 ページ) セレクタ (93 ページ) 例 外 処 理 (98 ページ) スレッド 化 (102 ページ) この 文 書 の 最 後 の 用 語 解 説 では Objective-Cとオブジェクト 指 向 プログラミングに 特 有 の 用 語 の 定 義 をまとめています 表 記 規 則 この 文 書 では リテラル 文 字 と 斜 体 を 使 用 しています リテラル 文 字 は 単 語 または 文 字 を 文 字 通 り に 受 け 取 るべきこと( 文 字 通 りに 入 力 すること)を 表 します 斜 体 は ほかの 何 かを 表 す あるいは 変 化 する 語 を 示 します たとえば 次 の 構 文 があるとします @interface ClassName ( CategoryName ) これは @interfaceと2つの 括 弧 が 必 須 ですが クラス 名 とカテゴリ 名 は 選 択 できることを 意 味 しま す コード 例 を 示 す 場 合 省 略 記 号 (...)は コードの 一 部 (しばしばかなりの 量 )が 省 略 されているこ とを 表 します - (void)encodewithcoder:(nscoder *)coder { [super encodewithcoder:coder]; 8

はじめに 関 連 項 目 }... 関 連 項 目 オブジェクト 指 向 プログラミングを 使 用 してアプリケーションを 作 成 した 経 験 がない 場 合 は Object-Oriented Programming with Objective-C を 読 む 必 要 があります C++やJavaなどのほかのオブ ジェクト 指 向 開 発 環 境 を 使 用 したことがある 場 合 も これらの 言 語 にはObjective-C 言 語 とは 異 なる 想 定 や 規 則 が 多 数 あるため この 文 書 をお 読 みください Object-OrientedProgrammingwithObjective-C は Objective-Cデベロッパの 視 点 からオブジェクト 指 向 開 発 に 習 熟 できるように 作 られています オ ブジェクト 指 向 設 計 の 意 味 をいくつか 詳 しく 説 明 し オブジェクト 指 向 プログラムを 書 くということ が 実 際 にはどのようなことなのかを 説 明 します ランタイムシステム Objective-C Runtime Programming Guide では Objective-Cランタイムとその 使 い 方 について 説 明 し ています Objective-C Runtime Reference では Objective-Cのランタイムサポートライブラリのデータ 構 造 と 関 数 について 説 明 します プログラムからこれらのインターフェイスを 使 用 して Objective-Cのラン タイムシステムとやり 取 りすることができます たとえば クラスまたはメソッドを 追 加 したり ロードされているクラスの 全 クラス 定 義 のリストを 取 得 したりできます メモリ 管 理 Objective-Cは メモリ 管 理 の3つの 仕 組 みをサポートしています 1つは 自 動 ガベージコレクション で もう1つは 参 照 カウントです 自 動 参 照 カウント(ARC Automatic Reference Counting) コンパイラがオブジェクトの 存 続 期 間 を 推 論 します 非 自 動 参 照 カウント(MRC Manual Reference Counting あるいはMRR Manual Retain/Release) オブジェクトの 存 続 期 間 の 決 定 についてデベロッパが 最 終 的 な 責 任 を 負 います 非 自 動 参 照 カウントについては Advanced Memory Management Programming Guide を 参 照 して ください ガベージコレクション 自 動 コレクタ にオブジェクトの 存 続 期 間 の 決 定 権 を 渡 します ガベージコレクションについては Garbage Collection Programming Guide を 参 照 してください (この 環 境 はiOSでは 利 用 できません このため ios Dev Centerからこの 文 書 にアクセスするこ とはできません) 9

オブジェクト クラス メッセージ この 章 では Objective-C 言 語 で 使 用 し 実 装 するオブジェクト クラス メッセージの 基 本 について 説 明 します また Objective-Cランタイムについても 紹 介 します ランタイムシステム Objective-C 言 語 では 可 能 な 限 り 多 くの 決 定 が コンパイル 時 とリンク 時 ではなく 実 行 時 に 行 われま す 可 能 な 場 合 は 必 ず オブジェクトの 作 成 やどのメソッドを 呼 び 出 すかの 決 定 などの 操 作 は 動 的 に 実 行 されます このため Objective-C 言 語 は コンパイラだけでなく コンパイルしたコードを 実 行 するランタイムシステムも 必 要 とします ランタイムシステムは Objective-C 言 語 にとって 一 種 のオ ペレーティングシステムとして 動 作 し 言 語 を 機 能 させるものです ただし 通 常 はランタイムと 直 接 やり 取 りをする 必 要 はありません これが 提 供 する 機 能 について 詳 しくは Objective-C Runtime Programming Guide を 参 照 してください オブジェクト オブジェクト 指 向 プログラムは その 名 称 が 示 すように オブジェクトを 中 心 に 構 築 されます オブ ジェクトは データと そのデータを 使 用 したりデータに 作 用 したりする 特 定 の 操 作 を 関 連 付 けたも のです Objective-Cには 特 定 のクラスを 指 定 せずにオブジェクト 変 数 を 識 別 するデータ 型 がありま す オブジェクトの 基 礎 オブジェクトは データと そのデータを 使 用 したりデータに 作 用 したりする 特 定 の 操 作 を 関 連 付 け たものです Objective-Cでは これらの 操 作 は オブジェクトのメソッドとして 知 られています メ ソッドが 作 用 するデータのことをインスタンス 変 数 といいます(ほかの 環 境 では ivars またはメンバ 変 数 と 呼 ばれることもあります) 要 するに オブジェクトはデータ 構 造 (インスタンス 変 数 )とプ ロシージャのグループ(メソッド)を 自 己 完 結 型 のプログラミング 単 位 にまとめたものです Objective-Cでは オブジェクトのインスタンス 変 数 はオブジェクトに 内 在 し 一 般 に オブジェクト のメソッドによってのみオブジェクトの 状 態 にアクセスできます( 有 効 範 囲 を 指 定 するディレクティ ブを 使 えば サブクラスやほかのオブジェクトからインスタンス 変 数 に 直 接 アクセスできるかどうか 指 定 できます 詳 細 については インスタンス 変 数 の 有 効 範 囲 (43 ページ)を 参 照 してくださ 10

オブジェクト クラス メッセージ オブジェクト い) 他 者 がオブジェクトに 関 する 情 報 を 得 るには 情 報 を 提 供 するメソッドがなければなりませ ん たとえば 矩 形 (Rectangleオブジェクト)であれば そのサイズと 位 置 を 示 すメソッドを 持 って います さらに オブジェクトはそのオブジェクト 用 に 設 計 されたメソッドだけを 認 識 するため ほかの 型 の オブジェクトを 対 象 としたメソッドを 誤 って 実 行 することはありません ローカル 変 数 の 保 護 のた め C 関 数 がプログラムのほかの 部 分 からローカル 変 数 を 隠 すのと 同 じように オブジェクトもその インスタンス 変 数 とメソッド 実 装 を 隠 します id Objective-Cでは オブジェクト 識 別 子 はidという 明 確 なデータ 型 として 定 められています この 型 は クラスに 関 係 なくどの 種 類 のオブジェクトにも 対 応 する 汎 用 的 な 型 であり クラスのインスタン スとクラスオブジェクトのインスタンスに 対 して 使 用 できます id anobject; メソッドの 戻 り 値 など Objective-Cのオブジェクト 指 向 構 成 体 では idはデフォルトデータ 型 として intから 置 き 換 わりました( 関 数 の 戻 り 値 など Cに 限 定 される 構 成 体 については デフォルトの 型 は intのままです) キーワードnilは NULLオブジェクト すなわち 値 が0のidとして 定 義 されます id nil その 他 の Objective-Cの 基 本 的 な 型 はヘッダファイルobjc/objc.hで 定 義 されています idは オブジェクトデータ 構 造 体 へのポインタとして 定 義 されています typedef struct objc_object { } *id; Class isa; このように どのオブジェクトにもそれがどのクラスのインスタンスかを 表 すisa 変 数 があります Class 型 はそれ 自 身 がポインタとして 定 義 されています typedef struct objc_class *Class; このため isa 変 数 は しばしば isaポインタ と 呼 ばれます 11

オブジェクト クラス メッセージ オブジェクト 動 的 型 定 義 id 型 は 完 全 に 非 制 限 的 です 単 独 では 対 象 がオブジェクトであること 以 外 の 情 報 は 示 しません あ る 時 点 で プログラムは 通 常 プログラム 内 に 含 まれているオブジェクトに 関 する 詳 細 な 情 報 を 検 出 する 必 要 があります id 型 指 示 子 はこの 特 定 の 情 報 をコンパイラに 提 供 できないため 各 オブジェク トが 実 行 時 にこれらの 情 報 を 提 供 できる 必 要 があります isaインスタンス 変 数 はオブジェクトのクラス(それがどの 種 類 のオブジェクトか)を 識 別 します 同 じ 振 る 舞 い(メソッド)と 同 じ 種 類 のデータ(インスタンス 変 数 )を 持 つオブジェクトは 同 じク ラスのメンバです このように オブジェクトは 実 行 時 に 動 的 に 型 定 義 されます 必 要 な 場 合 はいつでも オブジェクト に 要 求 するだけで ランタイムシステムはオブジェクトが 属 している 正 確 なクラスを 検 出 することが できます(ランタイムについて 詳 しくは Objective-C Runtime Programming Guide を 参 照 してくだ さい) Objective-Cの 動 的 型 定 義 は 後 述 する 動 的 バインディングの 基 礎 となります また isa 変 数 によって オブジェクトがイントロスペクションを 実 行 して オブジェクト 自 身 (また はほかのオブジェクト)に 関 する 情 報 を 得 ることが 可 能 になります コンパイラは クラス 定 義 に 関 する 情 報 をデータ 構 造 に 記 録 して ランタイムシステムが 使 用 できるようにします ランタイムシス テムの 関 数 は isaを 使 用 して 実 行 時 にこの 情 報 を 検 出 します ランタイムシステムでは たとえ ば オブジェクトが 特 定 のメソッドを 実 装 しているかどうかを 突 き 止 めたり そのスーパークラスの 名 前 を 調 べたりできます オブジェクトクラスの 詳 細 については クラス (19 ページ)を 参 照 してください また ソースコードの 中 でクラス 名 を 使 用 して 静 的 に 型 定 義 することで オブジェクトのクラスに 関 する 情 報 をコンパイラに 提 供 することもできます クラスは 特 別 な 種 類 のオブジェクトであり クラ ス 名 は 型 の 名 前 として 機 能 します 詳 細 については クラスの 型 (24 ページ)と 静 的 な 動 作 の 実 現 (88 ページ)を 参 照 してください メモリ 管 理 いずれのプログラムにおいても 不 要 になったオブジェクトは 必 ず 割 り 当 て 解 除 することが 重 要 で す そうしないと アプリケーションのメモリ 占 有 率 が 必 要 以 上 に 大 きくなります また まだ 使 用 しているオブジェクトは 絶 対 に 割 り 当 て 解 除 しないようにすることも 重 要 です Objective-Cではこれらの 目 標 を 達 成 することを 可 能 にする メモリ 管 理 のための3つの 仕 組 みを 提 供 しています 自 動 参 照 カウント(ARC Automatic Reference Counting) コンパイラがオブジェクトの 存 続 期 間 を 推 論 します 非 自 動 参 照 カウント(MRC Manual Reference Counting あるいはMRR Manual Retain/Release) オブジェクトの 存 続 期 間 の 決 定 についてデベロッパが 最 終 的 な 責 任 を 負 います 12

オブジェクト クラス メッセージ オブジェクトメッセージング 非 自 動 参 照 カウントについては Advanced Memory Management Programming Guide を 参 照 して ください ガベージコレクション 自 動 コレクタ にオブジェクトの 存 続 期 間 の 決 定 権 を 渡 します ガベージコレクションについては Garbage Collection Programming Guide を 参 照 してください (この 環 境 はiOSでは 利 用 できません このため ios Dev Centerからこの 文 書 にアクセスするこ とはできません) オブジェクトメッセージング このセクションでは メッセージ 送 信 の 構 文 について 説 明 します メッセージ 式 をネストする 方 法 な ども 取 り 上 げます また オブジェクトのインスタンス 変 数 の 有 効 範 囲 すなわち 可 視 性 や ポ リモーフィズムと 動 的 バインディングの 概 念 も 説 明 します メッセージの 構 文 オブジェクトに 何 かを 実 行 させるには メソッドの 適 用 を 指 示 するメッセージをオブジェクトに 送 信 します Objective-C では メッセージ 式 を 大 括 弧 で 囲 みます [receiver message] receiverはレシーバとなるオブジェクトであり messageは 実 行 すべきことをオブジェクトに 通 知 しま す ソースコードでは メッセージは 単 にメソッドの 名 前 とそれに 渡 されるパラメータです メッ セージを 送 信 すると ランタイムシステムは レシーバの 持 つすべてのメソッドの 中 から 適 切 なメ ソッドを 選 択 して 呼 び 出 します たとえば 次 のメッセージは myrectangleオブジェクトに 対 して 長 方 形 を 表 示 するdisplayメ ソッドを 実 行 するように 指 示 します [myrectangle display]; メッセージの 後 には Cのステートメントと 同 様 に ; が 付 きます メッセージ 内 のメソッド 名 はメソッド 実 装 を 選 択 する 役 割 を 果 たすため メッセージ 内 のメソッ ド 名 はしばしばセレクタと 呼 ばれます メソッドは パラメータ( 引 数 とも 呼 ばれます)をとることもあります 単 一 のパラメータを 持 つ メッセージでは 名 前 の 後 にコロン(:)が 付 き コロンの 直 後 にパラメータが 付 きます 13

オブジェクト クラス メッセージ オブジェクトメッセージング [myrectangle setwidth:20.0]; 複 数 のパラメータをとるメソッドの 場 合 Objective-Cのメソッド 名 は 名 前 の 中 にパラメータが 挟 み 込 まれ その 名 前 によって 想 定 されるパラメータが 必 然 的 に 分 かるようになっています 次 のメッセー ジ 例 は myrectangleオブジェクトに 対 して 原 点 を 座 標 (30.0, 50.0)に 設 定 するように 指 示 します [myrectangle setoriginx: 30.0 y: 50.0]; // 複 数 のパラメータを // 適 切 に 扱 っている 例 セレクタ 名 には コロンも 含 め 名 前 のすべての 部 分 が 含 まれるため 上 記 の 例 のセレクタの 名 前 は setoriginx:y:です コロンが2つあるのはパラメータを2つとるためです ただし セレクタ 名 には それ 以 外 のもの( 戻 り 型 やパラメータ 型 など)は 含 まれません Important: Objective-Cのセレクタを 構 成 する 要 素 は 省 略 可 能 ではなく 順 番 も 任 意 ではありませ ん いくつかのプログラミング 言 語 では 名 前 付 きパラメータ と キーワードパラメータ という 言 葉 は そのパラメータが 実 行 時 に 数 が 異 なってもよいこと デフォルト 値 があること 順 番 が 異 なっていてもよいこと および 追 加 の 名 前 付 きパラメータを 持 てることを 意 味 します パラメータに 関 するこれらの 特 徴 は Objective-Cについては 当 てはまりません Objective-Cメソッド 宣 言 は 大 まかに 言 えば 単 純 に2つの 引 数 を 先 頭 に 追 加 したC 関 数 です ( Objective-C Runtime Programming Guide の Messaging を 参 照 してください) そのため Objective-Cのメソッド 宣 言 の 構 造 は 次 の 例 に 示 すような Pythonなどの 言 語 における 名 前 付 きパ ラメータやキーワードパラメータとは 異 なります def func(a, b, NeatMode=SuperNeat, Thing=DefaultThing): pass このPythonの 例 では ThingとNeatModeは 省 略 可 能 であるか または 呼 び 出 し 時 に 異 なる 値 を 持 つことが 可 能 です 原 則 上 は Rectangleクラスは 第 2パラメータのラベルなしでsetOrigin::メソッドを 実 装 するこ ともでき その 場 合 は 次 のように 呼 び 出 されます [myrectangle setorigin:30.0 :50.0]; // 複 数 のパラメータを 適 切 に 扱 っていない 例 構 文 的 には 間 違 いではありませんが setorigin::はメソッド 名 にパラメータが 組 み 込 まれていませ ん そのため 第 2パラメータは 事 実 上 ラベル 付 けされず メソッドのパラメータの 種 類 や 目 的 を 判 断 することが 難 しくなります 14

オブジェクト クラス メッセージ オブジェクトメッセージング メソッドは 可 変 個 のパラメータをとることもできますが 非 常 にまれです 付 加 的 なパラメータは メソッド 名 の 後 に コンマで 区 切 って 指 定 します(コロンと 異 なり コンマは 名 前 の 一 部 と 見 なされ ません) 次 の 例 では makegroup:メソッドに 1つの 必 須 パラメータ(group)と3つのオプションパ ラメータを 渡 しています [receiver makegroup:group, memberone, membertwo, memberthree]; 標 準 のC 関 数 と 同 じように メソッドは 値 を 返 すことができます 次 の 例 では myrectangleを 塗 り つぶした 長 方 形 として 描 画 する 場 合 はisFilled 変 数 をYESに 輪 郭 だけ 描 画 する 場 合 はNOに 設 定 しま す BOOL isfilled; isfilled = [myrectangle isfilled]; 変 数 とメソッドは 同 じ 名 前 を 持 てることに 注 意 してください メッセージ 式 は 別 のメッセージ 式 内 にネストすることができます 次 の 例 では ある 長 方 形 の 色 を 別 の 長 方 形 の 色 に 設 定 します [myrectangle setprimarycolor:[otherrect primarycolor]]; また Objective-Cには オブジェクトのアクセサメソッドを 呼 び 出 すためのコンパクトで 便 利 な 構 文 を 提 供 するドット(.) 演 算 子 もあります ドット 演 算 子 は 通 常 宣 言 済 みプロパティ 機 能 と 組 み 合 わせ て 使 用 されます( 宣 言 済 みプロパティ (67 ページ)を 参 照 ) これについては ドット 構 文 (18 ページ)で 説 明 します nilへのメッセージ 送 信 Objective-Cでは nilへのメッセージ 送 信 が 可 能 です( 実 行 時 に 影 響 はありません) Cocoaでは こ れを 利 用 するにはいくつかのパターンがあります メッセージからnilに 返 される 値 も 有 効 です メソッドがオブジェクトを 返 す 場 合 は nilに 送 信 されたメッセージは0(nil)を 返 します 次 に 例 を 示 します Person *motherinlaw = [[aperson spouse] mother]; ここではspouseオブジェクトがnilの 場 合 motherはnilに 送 信 され このメソッドはnilを 返 します 15

オブジェクト クラス メッセージ オブジェクトメッセージング メソッドが 任 意 のポインタ 型 sizeof(void*) 以 下 のサイズの 任 意 の 整 数 スカラ 値 float double long double またはlong longを 返 す 場 合 nilに 送 信 されたメッセージは0を 返 しま す メソッドがstructを 返 す 場 合 OS X ABI Function Call Guide で 定 義 されているようにレジスタ に 返 されることになっているため nilに 送 信 されたメッセージは structのどのフィールドに も 0.0を 返 します その 他 のstructデータ 型 では0のみになることはありません メソッドが 前 述 の 値 の 型 以 外 のものを 返 す 場 合 nilに 送 信 されたメッセージの 戻 り 値 は 不 定 で す 次 のコードの 一 部 はnilへのメッセージ 送 信 の 正 しい 使 い 方 を 示 しています id anobjectmaybenil = nil; // これは 有 効 if ([anobjectmaybenil methodthatreturnsadouble] == 0.0) { // 実 装 が 続 く... } レシーバのインスタンス 変 数 メソッドは 受 信 側 オブジェクトのインスタンス 変 数 に 自 動 的 にアクセスできます インスタンス 変 数 をパラメータとしてメソッドに 渡 す 必 要 はありません たとえば 上 記 のprimaryColorメソッド はパラメータを 持 ちませんが otherrectのプライマリカラーを 検 出 して 返 すことができます すべ てのメソッドはレシーバとそのインスタンス 変 数 を 引 き 継 ぐため それらをパラメータとして 宣 言 す る 必 要 はありません このような 規 則 により Objective-Cのソースコードは 簡 素 化 されます また オブジェクトとメッ セージに 対 するオブジェクト 指 向 プログラマの 考 え 方 もサポートされています 手 紙 が 家 庭 に 配 達 さ れるように メッセージはレシーバに 送 信 されます メッセージパラメータは 外 部 の 情 報 をレシー バにもたらします レシーバを 取 得 してくる 必 要 はありません メソッドは レシーバのインスタンス 変 数 にのみ 自 動 的 にアクセスできます メソッドが 別 のオブ ジェクトに 格 納 されている 変 数 に 関 する 情 報 を 必 要 とする 場 合 は その 変 数 の 内 容 を 明 らかにするよ うに 要 求 するメッセージを 該 当 するオブジェクトに 送 信 する 必 要 があります 前 記 のprimaryColor およびisFilledメソッドは まさにこの 目 的 で 使 用 しています インスタンス 変 数 への 参 照 の 詳 細 については クラスの 定 義 (35 ページ)を 参 照 してください 16

オブジェクト クラス メッセージ オブジェクトメッセージング ポリモーフィズム( 多 態 性 ) 前 述 の 例 に 示 したように Objective-Cのメッセージは 標 準 のC 関 数 呼 び 出 しと 同 じ 構 文 上 の 位 置 に 指 定 されます しかし メソッドはオブジェクトに 属 する ため メッセージは 関 数 呼 び 出 しとは 異 なる 振 る 舞 いをします 特 に オブジェクトは オブジェクト 用 に 定 義 されたメソッドによってのみ 操 作 できます ほかのオ ブジェクトが 同 じ 名 前 のメソッドを 持 っていても ほかのオブジェクト 用 に 定 義 されたメソッドと 混 同 されることはありません そのため 2つのオブジェクトは 同 じメッセージに 対 して 異 なる 応 答 をすることができます たとえば displayメッセージを 受 信 する 各 オブジェクトは それぞれ 独 自 の 方 法 で 自 身 を 表 示 することができます CircleとRectangleは カーソルを 追 跡 する 同 じ 指 示 に 対 して 異 なる 応 答 をします この 機 能 はポリモーフィズムと 呼 ばれ オブジェクト 指 向 プログラムの 設 計 において 重 要 な 役 割 を 果 たします 動 的 バインディングとポリモーフィズムにより さまざまな 種 類 の 多 数 のオブジェクトに 適 用 できるコードを 作 成 でき コードを 書 く 時 点 ではオブジェクトの 種 類 を 選 択 する 必 要 はありませ ん たとえば ほかのプロジェクトに 取 り 組 んでいる 別 のプログラマが 後 で 開 発 するオブジェクトで あっても 構 いません id 変 数 にdisplayメッセージを 送 信 するコードを 書 く 場 合 は displayメソッ ドを 持 つオブジェクトすべてが 潜 在 的 なレシーバになります 動 的 バインディング 関 数 呼 び 出 しとメッセージの 大 きな 違 いは 関 数 とそのパラメータがコンパイル 時 にコードの 中 で 結 合 されるのに 対 して メッセージと 受 信 側 のオブジェクトはプログラムを 実 行 してメッセージが 送 信 されるまで 結 合 されないことです したがって メッセージに 応 答 するために 呼 び 出 される 実 際 のメ ソッドは コードのコンパイル 時 ではなく 実 行 時 にのみ 知 ることができます メッセージが 送 信 されると ランタイムメッセージングルーチンが レシーバとメッセージに 指 定 さ れたメソッド 名 を 確 認 します このルーチンは メソッド 名 の 一 致 するレシーバのメソッド 実 装 を 検 出 して そのメソッドを 呼 び 出 し レシーバのインスタンス 変 数 へのポインタを 渡 します(このルー チンの 詳 細 については Objective-C Runtime Programming Guide の Messaging を 参 照 してくださ い) このような メッセージに 対 するメソッドの 動 的 バインディングは ポリモーフィズムと 連 携 するこ とにより オブジェクト 指 向 プログラミングに 対 してより 高 い 柔 軟 性 と 能 力 を 提 供 します 各 オブ ジェクトが 独 自 のメソッドを 持 つことができるため メッセージを 変 えるのではなく メッセージを 受 信 するオブジェクトを 変 えることで Objective-Cのステートメントはさまざまな 結 果 を 得 ることが できます レシーバはプログラムの 実 行 時 に 決 めることができます このためレシーバの 選 択 はユー ザの 操 作 などの 要 因 に 応 じて 行 うことができます たとえば Application Kit(AppKit)をベースにしたコードを 実 行 している 場 合 は どのオブジェクトが カット コピー および ペースト などのメニューコマンドからメッセージを 受 信 するか はユーザが 決 めます メッセージは 現 在 の 選 択 を 制 御 している 任 意 のオブジェクトに 送 信 されま 17

オブジェクト クラス メッセージ オブジェクトメッセージング す テキストを 表 示 するオブジェクトは copyメッセージに 対 して スキャン 画 像 を 表 示 するオブ ジェクトとは 異 なる 反 応 を 示 します 一 連 の 形 状 を 表 すオブジェクトは copyに 対 してはRectangle とは 異 なる 応 答 をすることがあります メッセージは 実 行 時 までメソッドを 選 択 しないため( 視 点 を 変 えると メソッドとメッセージのバインドは 実 行 時 まで 行 われないため) 動 作 におけるこれらの 違 いは メソッド 自 身 から 切 り 離 されています メッセージを 送 信 するコードは それらの 違 いを 考 慮 する 必 要 はなく 可 能 性 を 列 挙 する 必 要 もありません アプリケーションのオブジェクトはそれぞ れ copyメッセージ 独 自 の 方 法 で 応 答 することができます Objective-Cでは 動 的 バインディングをさらに 一 歩 進 めて 送 信 するメッセージ(メソッドセレクタ) も 実 行 時 に 決 定 する 変 数 にすることができますこの 仕 組 みについては Objective-C Runtime Programming Guide の Messaging を 参 照 してください 動 的 メソッド 解 決 動 的 メソッド 解 決 を 使 用 して クラスメソッドおよびインスタンスメソッドの 実 装 を 実 行 時 に 指 定 で きます 詳 細 については Objective-C Runtime Programming Guide の Dynamic Method Resolution を 参 照 してください ドット 構 文 Objective-Cには アクセサメソッドを 呼 び 出 す 大 括 弧 ([])の 代 わりとして ドット(.) 演 算 子 がありま す ドット 構 文 は Cの 構 造 体 要 素 にアクセスするときと 同 じパターンを 使 用 します myinstance.value = 10; printf("myinstance value: %d", myinstance.value); ただし オブジェクトに 関 して 使 用 される 場 合 ドット 構 文 は 構 文 上 の 便 宜 であり コンパイラ によってアクセサメソッドの 呼 び 出 しに 変 換 されます ドット 構 文 が 直 接 的 にインスタンス 変 数 の 取 得 や 設 定 を 行 うわけではありません 上 記 のコード 例 は 次 のコードと 完 全 に 同 じです [myinstance setvalue:10]; printf("myinstance value: %d", [myinstance value]); 当 然 ながら アクセサメソッドを 使 用 してオブジェクトの 独 自 のインスタンス 変 数 にアクセスする 場 合 は selfを 明 示 的 に 呼 び 出 す 必 要 があります 以 下 に 例 を 示 します self.age = 10; 18

オブジェクト クラス メッセージ クラス またはこれと 同 等 の [self setage:10]; self.を 使 用 しない 場 合 は インスタンス 変 数 に 直 接 アクセスします 次 の 例 では ageのsetアクセ サメソッドは 呼 び 出 されません age = 10; プロパティをたどっているときにnil 値 に 遭 遇 した 場 合 その 結 果 は 同 等 のメッセージをnilに 送 っ た 場 合 と 同 じです たとえば 次 の 組 み 合 わせはすべて 同 じです // パスの 各 メンバはオブジェクト x = person.address.street.name; x = [[[person address] street] name]; // パスにはCの 構 造 体 が 含 まれている // windowがnilの 場 合 または-contentViewがnilを 返 した 場 合 はクラッシュする y = window.contentview.bounds.origin.y; y = [[window contentview] bounds].origin.y; // setterの 使 用 例... person.address.street.name = @"Oxford Road"; [[[person address] street] setname: @"Oxford Road"]; クラス オブジェクト 指 向 プログラムは 通 常 さまざまなオブジェクトで 作 られています Cocoaフレーム ワークをベースにしたプログラムでは NSMatrixオブジェクト NSWindowオブジェクト NSDictionaryオブジェクト NSFontオブジェクト NSTextオブジェクト その 他 多 くのオブジェク トを 使 用 します また しばしば 同 じ 種 類 (クラス)の 複 数 のオブジェクト(たとえば NSArray オブジェクトやNSWindowオブジェクト)を 使 用 します Objective-Cでは クラスを 定 義 することでオブジェクトを 定 義 します クラス 定 義 は 一 種 のオブ ジェクトのプロトタイプです クラスのあらゆるメンバの 一 部 になるインスタンス 変 数 を 宣 言 し ク ラスの 全 オブジェクトが 使 用 できるメソッドのセットを 定 義 します 19

オブジェクト クラス メッセージ クラス コンパイラにより クラスごとに1つだけアクセス 可 能 なオブジェクトが 作 成 されます これがクラ スオブジェクトで そのクラスに 属 する 新 しいオブジェクトの 構 築 方 法 を 知 っています(そのため 伝 統 的 に ファクトリオブジェクト と 呼 ばれています) クラスオブジェクトはコンパイル 済 み のクラスであり それによって 構 築 されるオブジェクトがクラスのインスタンスです プログラムの 主 な 作 業 を 実 行 するオブジェクトは 実 行 時 にクラスオブジェクトによって 作 成 されたインスタンス です クラスの 全 インスタンスは 同 じメソッドのセットを 持 っており すべてが 同 じ 鋳 型 に 基 づくインスタ ンス 変 数 のセットを 持 っています オブジェクトはそれぞれ 固 有 のインスタンス 変 数 を 持 ちますが メソッドは 共 有 されます 慣 習 的 に クラス 名 は 大 文 字 で 始 まり(Rectangleなど) インスタンス 名 は 通 常 小 文 字 で 始 まりま す(myRectangleなど) 継 承 クラス 定 義 は 追 加 的 に 定 義 していきます つまり 定 義 する 新 しいクラスはすべて 別 のクラスをベー スにしており そのメソッドとインスタンス 変 数 を 継 承 します 新 しいクラスでは 継 承 したもの に 追 加 や 変 更 を 加 えるだけです 継 承 したコードを 複 製 する 必 要 はありません 継 承 によって すべてのクラスがリンクされ 1つのクラスをルートに 持 つ 階 層 ツリーを 形 成 します Foundationフレームワークをベースにしたコードを 書 いている 場 合 そのルートクラスは 一 般 的 に NSObjectです (ルートクラスを 除 く)すべてのクラスには ルートに1ステップ 近 いスーパークラ スがあります また (ルートクラスを 含 む)どのクラスも ルートから1ステップ 遠 い 任 意 のサブ クラスのスーパークラスになります 図 1-1に ドロープログラムで 使 用 されるいくつかのクラスの 階 層 を 示 します 図 1-1 ドロープログラムのクラス NSObject Graphic Image Text Shape Line Rectangle Circle Square 20

オブジェクト クラス メッセージ クラス 図 1-1では SquareクラスはRectangleクラスのサブクラス RectangleクラスはShapeのサブクラ ス ShapeはGraphicのサブクラス GraphicはNSObjectのサブクラスであることが 示 されていま す 継 承 は 累 積 的 なものです そのためSquareオブジェクトは 特 にSquareのために 定 義 されたメ ソッドとインスタンス 変 数 だけでなく Rectangle Shape Graphic NSObjectのために 定 義 され たメソッドとインスタンス 変 数 も 持 っています これは 簡 単 にいえば Squareオブジェクトは 単 な る 正 方 形 であるだけでなく 型 がNSObjectの 矩 形 (Rectangle) 図 形 (Shape) グラフィック(Graphic) オブジェクト(Object)でもあるということです そのため NSObject 以 外 のすべてのクラスは 別 のクラスを 特 殊 化 または 適 合 化 したものと 考 える ことができます 下 位 のサブクラスはそれぞれ 継 承 したものの 累 計 に 変 更 を 加 えます たとえば Squareクラスでは Rectangle( 矩 形 )をSquare( 正 方 形 )に 変 えるのに 必 要 な 最 小 限 のものだけが 定 義 されます クラスを 定 義 する 際 には そのスーパークラスを 宣 言 することでクラスを 階 層 にリンクします 作 成 するすべてのクラスは ( 新 しいルートクラスを 定 義 しない 限 り) 別 のクラスのサブクラスである 必 要 があります スーパークラスとして 利 用 できるクラスは 多 数 あります Cocoaには NSObjectクラ スと 250 以 上 の 追 加 クラスの 定 義 を 含 む 複 数 のフレームワークがあります そのまま 使 用 できる(そ のままプログラムに 組 み 込 める)クラスもあります また サブクラスを 定 義 して 自 分 自 身 のニーズ に 合 わせられるものもあります フレームワーククラスには 必 要 なものをほとんど 定 義 しながら 一 部 の 詳 細 はサブクラスの 実 装 に 任 されているものもあります したがって コードを 少 しだけ 記 述 して フレームワークのプログラ マによる 成 果 を 再 利 用 すれば 非 常 に 高 度 なオブジェクトを 作 成 することができます NSObjectクラス NSObjectはルートクラスなので スーパークラスはありません Objective-Cオブジェクトとオブジェ クトの 対 話 の 基 本 的 フレームワークは NSObjectで 定 義 されています NSObjectは 自 身 を 継 承 する クラスとクラスのインスタンスに オブジェクトとして 動 作 し ランタイムシステムと 連 携 する 能 力 を 与 えます 特 別 な 動 作 を 別 のクラスから 継 承 する 必 要 のないクラスでも NSObjectクラスのサブクラスにする べきです クラスのインスタンスには 少 なくとも 実 行 時 にObjective-Cオブジェクトのように 動 作 す る 能 力 が 必 要 です このような 能 力 をNSObjectクラスから 継 承 するほうが 新 しいクラス 定 義 で 新 たに 作 成 することに 比 べると より 簡 単 で 信 頼 性 も 高 くなります 21

オブジェクト クラス メッセージ クラス 注 : 新 しいルートクラスを 実 装 するのは 慎 重 な 作 業 が 必 要 で 多 くの 危 険 が 潜 んでいま す そのクラスは インスタンスを 割 り 当 て クラスに 接 続 し ランタイムシステムで 識 別 するなど NSObjectクラスが 実 行 する 多 くのことを 複 製 しなければなりません そのため 通 常 は ルートクラスとしてCocoaに 提 供 されているNSObjectクラスを 使 用 してください 詳 細 については NSObject Class Reference および NSObject Protocol Reference を 参 照 して ください インスタンス 変 数 の 継 承 クラスオブジェクトが 新 しいインスタンスを 作 成 すると 新 しいオブジェクトにはそのクラスに 定 義 されたインスタンス 変 数 だけでなく そのスーパークラスと スーパークラスのスーパークラスに 定 義 されたインスタンス 変 数 も ルートクラスまで 遡 って 含 まれます したがって NSObjectクラス で 定 義 された isaインスタンス 変 数 は あらゆるオブジェクトの 一 部 になります isaは 各 オブジェ クトをそのクラスに 結 び 付 けます 図 1-2は Rectangleクラスの 特 定 の 実 装 に 定 義 できるインスタンス 変 数 と それらがどこから 継 承 されているかを 示 しています オブジェクトをRectangleにする 変 数 がオブジェクトをShapeにする 変 数 に 追 加 され オブジェクトをShapeにする 変 数 がオブジェクトをGraphicにする 変 数 に 追 加 されると いうようになっている 点 に 注 目 してください 図 1-2 Rectangleのインスタンス 変 数 Class NSPoint NSColor Pattern... float float BOOL NSColor... isa; origin; *primarycolor; linepattern; width; height; filled; *fillcolor; declared in NSObject declared in Graphic declared in Shape declared in Rectangle クラスでのインスタンス 変 数 の 宣 言 は 必 須 ではありません 新 しいメソッドを 単 に 定 義 して 何 らか のインスタンス 変 数 が 必 要 な 場 合 は 継 承 するインスタンス 変 数 に 依 存 することができます たとえ ば Squareクラスは 自 身 の 新 しいインスタンス 変 数 を 宣 言 しなくても 構 いません メソッドの 継 承 オブジェクトは そのクラスに 定 義 されたメソッドだけでなく そのスーパークラスと スーパーク ラスのスーパークラスに 定 義 されたメソッドにも 階 層 のルートクラスまで 遡 ってアクセスできま す たとえば Squareオブジェクトは 自 身 のクラスで 定 義 されたメソッドはもちろん Rectangle Shape Graphic NSObjectのクラスで 定 義 されたメソッドも 使 用 できます 22

オブジェクト クラス メッセージ クラス したがって プログラムで 定 義 する 新 しいクラスは 階 層 で 上 位 にあるすべてのクラスのために 書 か れたコードを 利 用 することができます このような 継 承 は オブジェクト 指 向 プログラミングの 主 要 なメリットです Cocoaの 提 供 するオブジェクト 指 向 フレームワークのいずれかを 使 用 すると プロ グラムはフレームワーククラスのコードとして 実 装 されている 基 本 機 能 を 利 用 することができます 追 加 する 必 要 があるのは 標 準 機 能 をアプリケーションに 合 わせてカスタマイズするコードだけで す クラスオブジェクトも 階 層 で 上 位 にあるクラスを 継 承 します ただし クラスオブジェクトはイン スタンス 変 数 を 持 たないため(インスタンスだけが 持 ちます) メソッドだけを 継 承 します メソッドのオーバーライド 継 承 には1つの 便 利 な 例 外 があります 新 しいクラスを 定 義 する 際 に 階 層 の 上 位 にあるクラスで 定 義 されたメソッドと 同 じ 名 前 で 新 しいメソッドを 実 装 することができます 新 しいメソッドはオリ ジナルをオーバーライドします 新 しいクラスのインスタンスはオリジナルではなく 新 しいメソッド を 実 行 し 新 しいクラスのサブクラスもオリジナルではなく 新 しいメソッドを 継 承 します たとえばGraphicはdisplayメソッドを 定 義 していますが Rectangleは 独 自 のバージョンのdisplay メソッドを 定 義 することによってこれをオーバーライドしています GraphicメソッドはGraphicク ラスから 派 生 するあらゆる 種 類 のオブジェクトで 利 用 できますが Rectangleオブジェクトでは 利 用 できません Rectangleオブジェクトでは 代 わりに 独 自 に 定 義 したdisplayが 実 行 されます メソッドをオーバーライドするとオリジナルを 継 承 できなくなりますが 新 しいクラスで 定 義 された ほかのメソッドは 再 定 義 されたメソッドをスキップして オリジナルを 見 つけることができます ( 詳 細 については selfとsuperに 対 するメッセージ (46 ページ)を 参 照 してください) また 再 定 義 したメソッドには オーバーライド 対 象 メソッドを 組 み 込 むことができます この 場 合 新 しいメソッドはオーバーライド 対 象 メソッドを 完 全 に 置 き 換 えるのではなく 改 良 または 変 更 するにすぎません 階 層 内 の 複 数 のクラスで 同 じメソッドを 定 義 し それぞれの 新 しいバージョンで オーバーライド 対 象 メソッドを 組 み 込 んでいる 場 合 実 質 的 には 元 のメソッドの 実 装 がすべての 対 象 クラスに 拡 散 されていることになります サブクラスは 継 承 したメソッドをオーバーライドできますが 継 承 したインスタンス 変 数 はオーバー ライドできません オブジェクトは 継 承 するすべてのインスタンス 変 数 にメモリを 割 り 当 てるため 同 じ 名 前 で 新 しいインスタンス 変 数 を 宣 言 して 継 承 した 変 数 をオーバーライドすることはできませ ん オーバーライドを 試 みると コンパイラがエラーを 表 示 します 抽 象 クラス クラスの 中 には ほかのクラスに 継 承 されることのみを 目 的 としているものや 主 にほかのクラスに 継 承 されることを 目 的 としているものもあります このような 抽 象 クラスは さまざまなサブクラス が 使 用 できるメソッドとインスタンス 変 数 を 共 通 の 定 義 にグループ 化 します 抽 象 クラスは 通 常 単 23

オブジェクト クラス メッセージ クラス 独 では 不 完 全 ですが サブクラスを 実 装 する 負 担 を 軽 減 するのに 役 立 つコードが 含 まれています ( 抽 象 クラスを 使 用 するにはサブクラスが 必 要 であるため 抽 象 スーパークラスと 呼 ばれることもあ ります) ほかの 言 語 とは 異 なり Objective-Cには クラスを 抽 象 クラスとしてマークする 構 文 はありません また 抽 象 クラスのインスタンスを 作 成 することも 妨 げられません NSObjectクラスはCocoaでの 抽 象 クラスの 標 準 的 な 例 です NSObjectクラスのインスタンスをアプ リケーションで 使 用 することはありません これは 何 かに 使 用 できるものではなく 特 に 何 かを 行 う 機 能 のない 汎 用 オブジェクトです これに 対 して NSViewクラスは 場 合 によっては 直 接 使 用 する 可 能 性 のある 抽 象 クラスの 一 例 です 抽 象 クラスには 多 くの 場 合 アプリケーションの 構 造 を 定 義 するのに 役 立 つコードが 含 まれていま す 抽 象 クラスのサブクラスを 作 成 すると 新 しいクラスのインスタンスは 特 に 問 題 なくアプリケー ション 構 造 に 適 合 し ほかのオブジェクトと 自 動 的 に 連 携 します クラスの 型 クラス 定 義 は 特 定 の 種 類 のオブジェクトの 仕 様 です したがって クラスは 実 質 的 にデータ 型 を 規 定 します このデータ 型 は クラスで 定 義 されるデータ 構 造 (インスタンス 変 数 )だけでなく 定 義 に 含 まれている 動 作 (メソッド)もベースにしています sizeof 演 算 子 の 引 数 などのように C 言 語 において 型 指 定 子 を 指 定 できる 場 所 ならば クラス 名 を ソースコードに 記 述 できます int i = sizeof(rectangle); 静 的 な 型 定 義 idの 代 わりにクラス 名 を 使 用 して オブジェクトの 型 を 指 定 することができます Rectangle *myrectangle; このような 方 法 でのオブジェクト 型 の 宣 言 は オブジェクトの 種 類 に 関 する 情 報 をコンパイラに 提 供 するため 静 的 な 型 定 義 と 呼 ばれています idが 実 際 にはポインタであるのと 同 様 に オブジェクト はクラスへのポインタとして 静 的 に 型 定 義 されています オブジェクトは 必 ずポインタとして 型 定 義 されます 静 的 な 型 定 義 はポインタを 明 示 的 なものにし idはポインタを 隠 蔽 します 24

オブジェクト クラス メッセージ クラス 静 的 な 型 定 義 により コンパイラは 型 チェックを 行 うことができ(たとえば オブジェクトがメッ セージを 受 信 しても 応 答 できないと 警 告 する) 一 般 的 に idとして 型 定 義 されたオブジェクトに 適 用 される 制 限 を 緩 和 することができます さらに ほかの 人 に 対 して ソースコードの 意 図 を 明 らか にします ただし 静 的 な 型 定 義 は 動 的 バインディングを 無 効 化 するものではなく 実 行 時 における レシーバのクラスの 動 的 な 決 定 を 変 更 するものでもありません オブジェクトは 自 身 のクラスまたは 継 承 するクラスとして 静 的 に 型 定 義 することができます たと えば ( 図 1-1 (20 ページ)のサンプルの 階 層 に 示 したとおり) 継 承 によりRectangleオブジェクト はGraphicオブジェクトの 一 種 になるため RectangleインスタンスはGraphicクラスに 合 わせて 静 的 に 定 義 できます Graphic *myrectangle; RectangleオブジェクトはGraphicオブジェクトであるため ここではスーパークラスとして 静 的 に 型 定 義 することができます さらに ShapeオブジェクトとRectangleオブジェクトのインスタンス 変 数 とメソッド 機 能 も 持 っているのでこれだけではありませんが それでもRectangleオブジェクト はGraphicオブジェクトです 型 チェックの 目 的 のため ここに 示 した 宣 言 が 与 えられると コンパ イラはmyRectangleの 型 はGraphicであると 見 なします しかし 実 行 時 にmyRectangleオブジェク トがRectangleのインスタンスとして 割 り 当 てられ 初 期 化 されると オブジェクトはそのとおりに 扱 われます 静 的 な 型 定 義 とそのメリットの 詳 細 については 静 的 な 動 作 の 実 現 (88 ページ)を 参 照 してくだ さい 型 のイントロスペクション インスタンスは 実 行 時 にその 型 を 明 らかにすることができます ismemberofclass:メソッドは NSObjectクラスで 定 義 されており レシーバが 特 定 のクラスのインスタンスかどうかをチェックし ます if ( [anobject ismemberofclass:someclass] )... iskindofclass:メソッドもnsobjectクラスで 定 義 されており レシーバが 特 定 のクラスを 継 承 して いるか またはそのクラスに 属 しているか(レシーバの 継 承 パス 内 にそのクラスがあるかどうか) を もっと 広 くチェックします if ( [anobject iskindofclass:someclass] )... 25

オブジェクト クラス メッセージ クラス iskindofclass:がyesを 返 すクラスのセットは レシーバを 静 的 に 型 定 義 できるものと 同 じセット です イントロスペクションで 調 べられる 情 報 は 型 情 報 に 限 られていません この 章 の 後 のセクションで は クラスオブジェクトを 返 したり オブジェクトがメッセージに 応 答 できるかどうかを 報 告 した り その 他 の 情 報 を 明 らかにするメソッドについて 説 明 します iskindofclass:メソッド ismemberofclass:メソッド および 関 連 するメソッドの 詳 細 について は NSObject Class Reference を 参 照 してください クラスオブジェクト クラス 定 義 には 次 のようなさまざまな 情 報 が 含 まれており その 大 部 分 はクラスのインスタンスに 関 するものです クラスとそのスーパークラスの 名 前 インスタンス 変 数 のセットを 記 述 したテンプレート メソッド 名 およびその 戻 り 値 とパラメータの 型 の 宣 言 メソッドの 実 装 これらの 情 報 はコンパイルされて ランタイムシステムで 利 用 できるデータ 構 造 に 記 録 されます コ ンパイラは クラスを 表 すオブジェクト すなわちクラスオブジェクトを1つだけ 作 成 します クラ スオブジェクトは クラスに 関 するすべての 情 報 にアクセスできます これは 主 にクラスのインス タンスを 表 す 情 報 です クラス 定 義 によって 規 定 されるプランに 従 って 新 しいインスタンスを 生 成 することができます クラスオブジェクトはクラスインスタンスのプロトタイプを 保 持 していますが それ 自 体 はインスタ ンスではありません クラスオブジェクトは 独 自 のインスタンス 変 数 を 持 っていませんし クラスの インスタンスを 対 象 としたメソッドを 実 行 することができません しかし クラス 定 義 は 特 にクラス オブジェクトを 対 象 としたメソッド すなわちインスタンスメソッドではなく クラスメソッドを 含 むことができます インスタンスがインスタンスメソッドを 継 承 するのと 同 じように クラスオブ ジェクトは 階 層 の 上 位 にあるクラスからクラスメソッドを 継 承 します ソースコードでは クラスオブジェクトはクラス 名 で 表 されます 次 の 例 では Rectangleクラスが NSObjectクラスから 派 生 したメソッドを 使 用 してクラスのバージョン 番 号 を 返 します int versionnumber = [Rectangle version]; 26

オブジェクト クラス メッセージ クラス ただし クラス 名 は メッセージ 式 の 単 なるレシーバとしてのクラスオブジェクトを 表 します その 他 の 場 合 は インスタンスまたはクラスに 対 してidクラスを 返 すように 要 求 する 必 要 があります 次 のどちらの 文 もclassメッセージに 応 答 します id aclass = [anobject class]; id rectclass = [Rectangle class]; 上 記 の 例 に 示 すように クラスオブジェクトはほかのオブジェクトと 同 様 に idとして 型 定 義 できま す しかし クラスオブジェクトは Classデータ 型 としてより 明 示 的 に 型 定 義 することもできま す Class aclass = [anobject class]; Class rectclass = [Rectangle class]; すべてのクラスオブジェクトはClass 型 です この 型 名 をクラスに 使 用 するのは クラス 名 を 使 用 し てインスタンスを 静 的 に 型 定 義 するのと 同 じです つまり クラスオブジェクトは 動 的 に 型 定 義 したり メッセージを 受 信 したり ほかのクラスから メソッドを 継 承 することができる 完 全 なオブジェクトです クラスオブジェクトが 特 別 であるのは コンパイラによって 作 成 され クラス 定 義 に 基 づいて 構 築 されるものを 除 けば 自 身 のデータ 構 造 (イ ンスタンス 変 数 )がなく 実 行 時 にインスタンスを 生 成 するエージェントであるという 点 だけです 注 : コンパイラは 各 クラスの メタクラスオブジェクト も 構 築 します クラスオブジェ クトがクラスのインスタンスを 示 すのと 同 じように メタクラスオブジェクトはクラスオブ ジェクトを 示 します ただし インスタンスやクラスオブジェクトにメッセージを 送 信 でき るのに 対 し メタクラスオブジェクトはランタイムシステムによって 内 部 的 に 使 用 されるだ けです インスタンスの 作 成 クラスオブジェクトの 主 要 な 機 能 は 新 しいインスタンスを 作 成 することです 次 のコードは Rectangleクラスに 対 して 新 しいRectangleインスタンスを 作 成 して myrectangle 変 数 に 割 り 当 てる ように 指 示 します id myrectangle; myrectangle = [Rectangle alloc]; 27

オブジェクト クラス メッセージ クラス allocメソッドは 新 しいオブジェクトのインスタンス 変 数 に 動 的 にメモリを 割 り 当 て すべてを0 に 初 期 化 します ただし 新 しいインスタンスをそのクラスに 結 び 付 けるisa 変 数 は 除 きます オブ ジェクトが 有 用 であるためには 通 常 は 完 全 に 初 期 化 する 必 要 があります その 初 期 化 を 行 うのが initメソッドの 機 能 です 初 期 化 は 通 常 割 り 当 ての 直 後 に 行 います myrectangle = [[Rectangle alloc] init]; この 章 のこれまでの 例 で 示 したメッセージをmyRectangleで 受 信 するには 先 に 上 記 のようなコード が 必 要 です allocメソッドは 新 しいインスタンスを 返 し そのインスタンスがinitメソッドを 実 行 して 初 期 状 態 に 設 定 します すべてのクラスオブジェクトに 新 しいオブジェクトを 生 成 するメソッ ド(allocなど)が 少 なくとも1つはあり すべてのインスタンスは それを 使 えるように 準 備 する メソッド(initなど)が 少 なくとも1つあります 初 期 化 メソッドは 多 くの 場 合 特 定 の 値 を 渡 せる パラメータをとり パラメータにラベルを 付 けるキーワードを 持 っていますが(たとえば 新 しい Rectangleインスタンスを 初 期 化 するメソッドであるinitWithPosition:size:など) 初 期 化 メ ソッドはすべて init から 始 まります クラスオブジェクトによるカスタマイズ クラスをオブジェクトとして 扱 うのは Objective-C 言 語 では 偶 然 ではありません それは 意 図 的 で ときには 意 外 な 設 計 上 のメリットを 持 つ 選 択 なのです たとえば クラスが 制 限 のないセットに 属 している 場 合 は クラスでオブジェクトをカスタマイズすることができます AppKitでは たとえ ば 特 定 の 種 類 のNSCellオブジェクトを 使 用 してNSMatrixオブジェクトをカスタマイズできます NSMatrixオブジェクトは セルを 表 す 個 々のオブジェクトを 作 成 することができます オブジェク トの 作 成 は 行 列 を 最 初 に 初 期 化 する 際 と あとで 新 しいセルが 必 要 なときに 可 能 です NSMatrix オブジェクトが 画 面 上 に 描 画 する 目 に 見 える 行 列 は 実 行 時 にユーザの 操 作 に 応 じて 拡 大 / 縮 小 する ことができます 拡 大 する 場 合 行 列 は 追 加 される 新 しいスロットを 満 たすため 新 しいオブジェ クトを 生 成 する 必 要 があります 28

オブジェクト クラス メッセージ クラス それらを どのようなオブジェクトにすべきかについて 次 に 説 明 します それぞれの 行 列 は1 種 類 の NSCellのみを 表 示 しますが 種 類 はさまざまにあります 図 1-3の 継 承 階 層 は AppKitによって 提 供 される 継 承 階 層 の 一 部 を 示 しています すべてが 汎 用 NSCellクラスを 継 承 します 図 1-3 NSCellの 継 承 階 層 NSObject NSCell NSBrowserCell NSActionCell NSButtonCell NSTextFieldCell NSSliderCell NSFormCell NSMenuCell ある 行 列 がNSCellオブジェクトを 作 成 するとき それらは 一 連 のボタンやスイッチを 表 示 する NSButtonCellオブジェクトであるべきでしょうか それともユーザがテキストの 入 力 や 編 集 ができ るフィールドを 表 示 するNSTextFieldCellオブジェクトであるべきでしょうか あるいはほかの 種 類 のNSCellにするべきでしょうか NSMatrixオブジェクトは あらゆる 種 類 のセルに 対 応 しなければ なりません まだ 作 成 されていない 型 についても 考 慮 しなければなりません この 問 題 に 対 する1つの 解 決 策 は NSMatrixクラスを 抽 象 クラスとして 定 義 し それを 使 用 する 全 員 にサブクラスの 宣 言 と 新 しいセルを 生 成 するメソッドの 実 装 を 義 務 付 けることです 使 用 者 側 が 新 しいセルを 生 成 するメソッドを 実 装 することになるため 作 成 したオブジェクトを 確 実 に 適 切 な 型 に することができます しかしこの 解 決 法 では NSMatrixクラス 自 身 で 行 われるべき 作 業 を NSMatrixクラスの 使 用 者 に 行 わせることになり クラスの 数 も 無 用 に 増 えます アプリケーションは 複 数 の 種 類 の 行 列 を 必 要 と し それぞれが 異 なる 種 類 のセルを 持 つ 可 能 性 があるため NSMatrixサブクラスで 雑 然 とする 可 能 性 があります 新 しいNSCellを 作 成 するたびに 新 しいNSMatrixも 定 義 する 必 要 があります さら に 別 々のプロジェクトのプログラマが 同 じ 処 理 を 実 行 するほとんど 同 じようなコードを 書 くこと になります すべてはNSMatrixがしないことを 補 うためです より 優 れた 解 決 策 であり NSMatrixクラスが 採 用 している 解 決 策 は NSMatrixインスタンスを 一 種 のNSCellで(クラスオブジェクトで) 初 期 化 することです NSMatrixクラスはまた 空 のスロット を 満 たすためにNSMatrixが 使 用 すべきNSCellオブジェクトを 表 すクラスオブジェクトを 渡 す setcellclass:メソッドを 定 義 しています [mymatrix setcellclass:[nsbuttoncell class]]; 29

オブジェクト クラス メッセージ クラス NSMatrixオブジェクトは 最 初 に 初 期 化 するとき および より 多 くのセルを 含 むようにサイズ 変 更 するときに クラスオブジェクトを 使 用 して 新 しいセルを 生 成 します クラスが メッセージで 渡 したり 変 数 に 割 り 当 てることのできるオブジェクトでなければ このようなカスタマイズは 困 難 で す 変 数 とクラスオブジェクト 新 しいクラスを 定 義 する 際 インスタンス 変 数 を 指 定 することができます クラスのあらゆるインス タンスが 宣 言 された 変 数 のコピーをそれぞれに 保 持 することができ 各 オブジェクトが 自 身 のデー タを 制 御 します ただし インスタンス 変 数 に 対 応 するクラス 変 数 はありません クラスに 提 供 され るのは クラス 定 義 に 基 づいて 初 期 化 された 内 部 データ 構 造 だけです また クラスオブジェクト は どのインスタンスのインスタンス 変 数 にもアクセスできません すなわち インスタンス 変 数 の 初 期 化 読 み 取 り または 変 更 ができません クラスのすべてのインスタンスがデータを 共 有 するには 何 らかの 外 部 変 数 が 必 要 になります これ を 実 行 する 最 も 簡 単 な 方 法 は クラス 実 装 ファイルで 変 数 を 宣 言 することです int MCLSGlobalVariable; @implementation MyClass // 実 装 が 続 く より 洗 練 された 実 装 では static 変 数 を 宣 言 し それらを 管 理 するクラスメソッドを 提 供 します static 変 数 を 宣 言 すると その 有 効 範 囲 は 当 該 クラスのみ 厳 密 にはそのファイルに 実 装 されたク ラスの 部 分 に 限 定 されます(したがって インスタンス 変 数 と 異 なり 静 的 変 数 をサブクラスによっ て 継 承 したり サブクラスで 直 接 操 作 したりできません) このパターンは シングルトンのような クラスの 共 有 インスタンスの 宣 言 によく 使 用 されます(シングルトンについては CocoaFundamentals Guide の Creating a Singleton Instance in Cocoa Fundamentals Guide を 参 照 してください) static MyClass *MCLSSharedInstance; @implementation MyClass + (MyClass *)sharedinstance { // 共 有 インスタンスの 有 無 を 確 認 する // 必 要 なら 作 成 する return MCLSSharedInstance; 30

オブジェクト クラス メッセージ クラス } // 実 装 が 続 く 静 的 な 変 数 は クラスオブジェクトに 対 して インスタンスを 生 成 するファクトリ 以 上 の 機 能 を 与 え る 役 割 も 持 ち それ 自 体 で 完 全 で 多 目 的 なオブジェクトになることができます クラスオブジェクト は 作 成 するインスタンスの 間 を 取 り 持 ったり 作 成 済 みオブジェクトのリストからインスタンスを 削 除 したり アプリケーションに 不 可 欠 なほかの 処 理 を 管 理 するために 使 用 することができます 特 定 クラスのオブジェクトが1つだけ 必 要 な 場 合 は オブジェクトの 状 態 をすべて 静 的 な 変 数 に 入 れて クラスメソッドのみを 使 用 するようにできます これにより インスタンスの 割 り 当 てと 初 期 化 のス テップを 省 けます 注 : staticとして 宣 言 されていない 外 部 変 数 を 使 用 することもできますが 別 々のオブジェ クトにデータをカプセル 化 するには 静 的 な 変 数 によって 有 効 範 囲 を 限 定 するほうが 有 効 で す クラスオブジェクトの 初 期 化 クラスオブジェクトをインスタンスの 割 り 当 て 以 外 に 使 用 する 場 合 は インスタンスのように 初 期 化 する 必 要 がある 場 合 もあります プログラムはクラスオブジェクトを 割 り 当 てませんが Objective-C はプログラムがそれらを 初 期 化 する 手 段 を 提 供 します クラスが 静 的 な 変 数 またはグローバル 変 数 を 利 用 する 場 合 は initializeメソッドがそれらの 初 期 値 の 設 定 に 適 しています たとえば クラスがインスタンスの 配 列 を 保 持 する 場 合 initializeメ ソッドでその 配 列 を 準 備 し さらに1つか2つのデフォルトインスタンスを 割 り 当 てて 用 意 しておくこ とができます ランタイムシステムは クラスがほかのメッセージを 受 信 する 前 およびそのスーパークラスが initializeメッセージを 受 信 した 後 に initializeメッセージをすべてのクラスオブジェクトに 送 信 します この 一 連 の 処 理 により クラスは 自 身 が 使 用 される 前 に ランタイム 環 境 を 準 備 する 機 会 を 与 えられます 初 期 化 が 不 要 な 場 合 は メッセージに 応 えるinitializeメソッドを 書 く 必 要 はあ りません 継 承 があるため スーパークラスがすでにinitializeメッセージを 受 信 していても initializeメ ソッドを 実 装 していないクラスへ 送 信 されたinitializeメッセージは スーパークラスへ 転 送 され ます たとえば クラスAはinitializeメソッドを 実 装 しており クラスBはクラスAを 継 承 している けれどもinitializeメソッドは 実 装 していないと 仮 定 します クラスBが 最 初 のメッセージを 受 信 す る 直 前 に ランタイムシステムはクラスBへinitializeを 送 信 します ただし クラスBはinitialize を 実 装 していないため クラスAのinitializeが 代 わりに 実 行 されます そのため クラスAでは 初 期 化 ロジックが1 回 だけ 適 切 なクラスに 対 して 実 行 されるようにしなければなりません 31

オブジェクト クラス メッセージ クラス 初 期 化 ロジックが 複 数 回 実 行 されるのを 防 ぐには initializeメソッドを 実 装 する 際 にリスト 1-1に 示 すテンプレートを 使 用 します リスト 1-1 initializeメソッドの 実 装 + (void)initialize { if (self == [ThisClass class]) { // ここで 初 期 化 を 実 行 する... } } 注 : ランタイムシステムはクラスごとにinitializeを 送 信 します そのため クラス 内 の initializeメソッド 実 装 で スーパークラスへinitializeメッセージを 送 信 する 必 要 はあ りません ルートクラスのメソッド クラスオブジェクト インスタンスオブジェクトを 問 わず オブジェクトはすべて ランタイムシス テムに 対 するインターフェイスが 必 要 です クラスオブジェクトとインスタンスはどちらも その 能 力 についてのイントロスペクションを 可 能 にし 継 承 階 層 における 位 置 を 報 告 できる 必 要 がありま す このインターフェイスを 提 供 するのはNSObjectクラスの 役 割 です NSObjectメソッドを 二 度 ( 一 度 はインスタンスにランタイムインターフェイスを 提 供 するため も う 一 度 はそのインターフェイスをクラスオブジェクトにコピーするため) 実 装 する 必 要 がないよう に クラスオブジェクトには ルートクラスで 定 義 されているインスタンスメソッドを 実 行 する 特 別 許 可 が 与 えられます クラスオブジェクトがクラスメソッドで 応 えられないメッセージを 受 信 する と ランタイムシステムは メッセージに 応 えられるルートインスタンスメソッドがあるかどうかを 調 べます クラスオブジェクトが 実 行 できるインスタンスメソッドは ルートクラスに 定 義 されてい るものだけであり 指 定 の 作 業 を 実 行 できるクラスメソッドがない 場 合 にのみ 実 行 できます ルートインスタンスのメソッドを 実 行 するクラスオブジェクトのこの 特 別 な 能 力 の 詳 細 については NSObject Class Reference を 参 照 してください 32

オブジェクト クラス メッセージ クラス ソースコードにおけるクラス 名 ソースコードでは まったく 異 なる2つのコンテキストでのみクラス 名 を 使 用 することができます これらのコンテキストは データ 型 およびオブジェクトとしてのクラスの ニ 重 の 役 割 を 反 映 してい ます クラス 名 は オブジェクトの 種 類 を 示 す 型 名 として 使 用 することができます 次 に 例 を 示 しま す Rectangle *anobject; この 場 合 anobjectは Rectangleのポインタとなるように 静 的 に 型 定 義 されています コンパ イラは 対 象 がRectangleインスタンスのデータ 構 造 と Rectangleクラスによって 定 義 されそ こから 継 承 したインスタンスメソッドを 持 っているものと 想 定 します 静 的 な 型 定 義 により コ ンパイラの 型 チェックを 強 化 し ソースコードの 自 己 文 書 化 をさらに 進 めることができます 詳 細 については 静 的 な 動 作 の 実 現 (88 ページ)を 参 照 してください 静 的 に 型 定 義 できるのはインスタンスだけです クラスオブジェクトは クラスのメンバではな くClassデータ 型 に 属 するため 静 的 に 型 定 義 できません メッセージ 式 のレシーバとしてのクラス 名 は クラスオブジェクトを 表 します このような 使 用 法 は これまでのいくつかの 例 で 示 しました クラス 名 は メッセージのレシーバとしてのみク ラスオブジェクトを 表 すことができます それ 以 外 のコンテキストでは クラスオブジェクトに (classメッセージを 送 信 して)idを 明 らかにするように 要 求 する 必 要 があります 次 の 例 では RectangleクラスをisKindOfClass:メッセージの 引 数 として 渡 しています if ( [anobject iskindofclass:[rectangle class]] )... パラメータとして 単 純 に Rectangle という 名 前 を 使 用 するのは 正 しくありません このクラス 名 はレシーバとしてのみ 指 定 できます コンパイル 時 にクラス 名 が 分 からなくても 実 行 時 に 文 字 列 として 持 っていれば NSClassFromStringを 使 用 してクラスオブジェクトを 返 すことができます NSString *classname;... if ( [anobject iskindofclass:nsclassfromstring(classname)] )... 渡 された 文 字 列 が 有 効 なクラス 名 でない 場 合 この 関 数 はnilを 返 します 33

オブジェクト クラス メッセージ クラス クラス 名 は グローバル 変 数 や 関 数 名 と 同 じネームスペースに 存 在 します クラスとグローバル 変 数 は 同 じ 名 前 を 持 つことができません クラス 名 は Objective-Cでグローバルに 認 識 できるほぼ 唯 一 の 名 前 です クラスの 等 価 性 のテスト ポインタを 直 接 比 較 することによって 2つのクラスオブジェクトが 等 しいかどうかをテストできま す ただし 適 切 なクラスを 取 得 することが 重 要 です Cocoaフレームワークには 機 能 を 拡 張 する ために 既 存 のクラスのサブクラスを 動 的 かつ 透 過 的 に 作 成 する 機 能 がいくつかあります(たとえば キー 値 監 視 やCore Dataはこれを 行 います これらの 機 能 については Key-ValueObservingProgramming Guide および CoreDataProgrammingGuide をそれぞれ 参 照 してください) 動 的 に 作 成 されたサ ブクラスでは classメソッドは 一 般 にオーバーライドされ 作 成 されたサブクラスは 元 のクラスの ように 振 る 舞 います したがって クラスの 等 価 性 をテストする 場 合 は 低 レベルの 関 数 の 戻 り 値 で はなく classメソッドの 戻 り 値 を 比 較 する 必 要 があります APIの 構 文 で 表 すと 動 的 サブクラスは 次 の 不 等 式 で 表 せます [object class]!= object_getclass(object)!= *((Class*)object) したがって 2つのクラスが 等 しいかどうかは 次 のようにしてテストすべきです if ([objecta class] == [objectb class]) { //... 34

クラスの 定 義 オブジェクト 指 向 プログラミングの 大 部 分 は 新 しいオブジェクトのコードを 書 くこと つまり 新 し いクラスを 定 義 することに 費 やされます Objective-Cでは クラスを2つに 分 けて 定 義 します クラスのメソッドとプロパティを 宣 言 し そのスーパークラスを 指 定 するインターフェイス 実 際 にクラスを 定 義 する 実 装 (メソッドを 実 装 するコードを 含 む) これらの 部 分 のそれぞれは 通 常 は 個 別 のファイルに 書 かれます しかし 場 合 によっては カテゴ リと 呼 ばれる 機 能 の 使 用 を 通 じて クラス 定 義 が 複 数 のファイルに 及 んでいることもあります カテ ゴリによって クラス 定 義 の 区 分 や 既 存 のクラス 定 義 の 拡 張 を 行 うことができます カテゴリにつ いては カテゴリと 拡 張 (78 ページ)で 説 明 します ソースファイル コンパイラによって 要 求 されているわけではありませんが クラスインターフェイスと 実 装 は 通 常 2つの 異 なるファイルに 書 かれます インターフェイスファイルは クラスを 使 用 する 全 員 が 利 用 で きるようにしなければなりません 1つのファイルで 複 数 のクラスを 宣 言 または 実 装 することができます しかし クラスごとに 別 々 のインターフェイスファイルを 持 つのが 通 例 で 実 装 ファイルも 別 々です クラスインターフェイス を 別 々にしておくことは それらが 互 いに 独 立 の 構 成 要 素 であることをより 的 確 に 反 映 します インターフェイスファイルと 実 装 ファイルには 通 常 クラスにちなんだ 名 前 を 付 けます 実 装 ファ イルの 名 前 には Objective-Cのソースコードを 含 んでいることを 示 す 拡 張 子.mが 付 けられます イン ターフェイスファイルには ほかの 任 意 の 拡 張 子 を 割 り 当 てることができます インターフェイス ファイルはほかのソースファイルにインクルードされるため 通 常 その 名 前 にはヘッダファイルの 典 型 的 な 拡 張 子 である.hが 付 けられます たとえば Rectangleクラスは Rectangle.hで 宣 言 さ れ Rectangle.mで 定 義 されます オブジェクトのインターフェイスと 実 装 を 分 けることは オブジェクト 指 向 プログラムの 設 計 によく 合 致 します オブジェクトは 自 己 完 結 型 の 構 成 要 素 であり 外 部 からはほとんどブラックボックスと 見 なすことができます プログラムのほかの 要 素 に 対 するオブジェクトの 対 話 方 法 をいったん 決 めた ら(つまり インターフェイスを 宣 言 したら) アプリケーションのほかの 部 分 に 影 響 を 与 えること なく その 実 装 を 自 由 に 変 更 することができます 35

クラスの 定 義 クラスインターフェイス クラスインターフェイス クラスインターフェイスの 宣 言 は コンパイラディレクティブ@interfaceで 始 まり ディレクティ ブ@endで 終 わります(コンパイラに 対 するObjective-Cのディレクティブはすべて @ で 始 まりま す) @interface ClassName : ItsSuperclass // メソッド 宣 言 プロパティ 宣 言 @end 宣 言 の1 行 目 では 新 しいクラス 名 を 指 定 し それをスーパークラスにリンクします 継 承 (20 ペー ジ)で 説 明 したように スーパークラスによって 継 承 階 層 における 新 しいクラスの 位 置 が 決 まりま す 次 に クラス 宣 言 の 終 わりまでの 間 に クラスのメソッドおよびプロパティを 宣 言 します クラスオ ブジェクトに 使 用 されるメソッドの 名 前 つまりクラスメソッドの 前 にはプラス 記 号 を 付 けます + alloc; クラスのインスタンスが 使 用 できるメソッド つまりインスタンスメソッドの 前 にはマイナス 記 号 を 付 けます - (void)display; 一 般 的 な 方 法 ではありませんが クラスメソッドとインスタンスメソッドを 同 じ 名 前 で 定 義 すること ができます メソッドの 名 前 をインスタンス 変 数 と 同 じ 名 前 にすることもでき 特 にメソッドが 変 数 に 値 を 返 す 場 合 には 同 じ 名 前 にするのが 一 般 的 です たとえば Circleは インスタンス 変 数 radiusと 一 致 するradiusというメソッドを 持 っているなどです メソッドの 戻 り 型 は 標 準 Cの 型 キャストの 構 文 を 使 って 宣 言 します - (float)radius; パラメータ 型 も 同 じ 方 法 で 宣 言 します - (void)setradius:(float)aradius; 36

クラスの 定 義 クラスインターフェイス 戻 り 型 やパラメータ 型 を 明 示 的 に 宣 言 しないと メソッドやメッセージのデフォルト 型 idと 見 なさ れます 前 述 のallocメソッドはidを 返 します 複 数 のパラメータがある 場 合 は メソッド 名 の 中 でコロンの 後 にパラメータを 宣 言 します パラメー タは メッセージの 場 合 と 同 様 に 宣 言 でも 名 前 が 区 切 られます 次 に 例 を 示 します - (void)setwidth:(float)width height:(float)height; 可 変 パラメータを 持 つメソッドは 関 数 と 同 様 に コンマと 省 略 記 号 を 使 って 引 数 を 宣 言 します - makegroup:group,...; プロパティ 宣 言 は 次 のような 形 式 です @property (attributes) Type propertyname; プロパティについては 宣 言 済 みプロパティ (67 ページ)で 詳 しく 説 明 しています 37

クラスの 定 義 クラスインターフェイス 注 : 歴 史 的 には インターフェイスにはクラスのインスタンス 変 数 宣 言 が 必 要 でした イン スタンス 変 数 は クラスの 各 インスタンスの 一 部 をなすデータ 構 造 です これは @interface 宣 言 とメソッド 宣 言 の 間 に 波 括 弧 ではさんで 記 述 します @interface ClassName : ItsSuperclass { // インスタンス 変 数 の 宣 言 } // メソッド 宣 言 プロパティ 宣 言 @end インスタンス 変 数 は 実 装 詳 細 であり 通 常 クラス 自 身 の 外 からアクセスされることはあり ません さらに 実 装 ブロック 内 に 宣 言 すること あるいは 宣 言 済 みプロパティから 自 動 生 成 させることも 可 能 です したがって 通 常 は インスタンス 変 数 宣 言 をパブリックインター フェイスで 行 うべきではないので 波 括 弧 も 省 略 してください インターフェイスのインポート インターフェイスファイルは 当 該 クラスインターフェイスに 依 存 するすべてのソースモジュールに インクルードする 必 要 があります 対 象 となるソースモジュールとしては 当 該 クラスのインスタン スを 作 成 したり クラスに 宣 言 したメソッドを 呼 び 出 すメッセージを 送 信 したり クラスで 宣 言 した インスタンス 変 数 を 記 述 するモジュールがあります インターフェイスは 通 常 #importディレク ティブでインクルードされます #import "Rectangle.h" このディレクティブは#includeと 同 じですが 同 じファイルが2 回 以 上 はインクルードされないこと が 保 証 されています そのため 使 用 が 推 奨 されており すべてのObjective-C 関 連 ドキュメントの コード 例 の 中 で #includeの 代 わりに 使 用 されています クラス 定 義 が 派 生 クラスの 定 義 に 基 づいて 構 築 されることを 反 映 して インターフェイスファイルは スーパークラスのインターフェイスをインポートすることで 始 まります #import "ItsSuperclass.h" @interface ClassName : ItsSuperclass // メソッド 宣 言 プロパティ 宣 言 38

クラスの 定 義 クラスインターフェイス @end この 規 則 は あらゆるインターフェイスファイルが すべての 派 生 クラスのインターフェイスファイ ルを 間 接 的 にインクルードすることを 意 味 します ソースモジュールがあるクラスインターフェイス をインポートすると そのクラスのベースとなっている 継 承 階 層 全 体 のインターフェイスが 得 られま す スーパークラスをサポートするprecomp(プリコンパイルされたヘッダ)がある 場 合 は 代 わりに precompをインポートすることもできます ほかのクラスの 参 照 インターフェイスファイルでクラスを 宣 言 すると そのスーパークラスをインポートすることで NSObjectからスーパークラスに 至 るまで すべての 派 生 クラスの 宣 言 を 暗 黙 のうちに 含 みます イ ンターフェイスがその 階 層 以 外 のクラスを 記 述 している 場 合 は それらを 明 示 的 にインポートする か @classディレクティブで 宣 言 する 必 要 があります @class Rectangle, Circle; このディレクティブは Rectangle と Circle がクラス 名 であることをコンパイラに 知 らせるだ けです インターフェイスファイルをインポートするものではありません インスタンス 変 数 戻 り 値 およびパラメータを 静 的 に 型 定 義 するときに インターフェイスファイ ルにクラス 名 を 記 述 します たとえば 次 の 宣 言 をご 覧 ください - (void)setprimarycolor:(nscolor *)acolor; この 宣 言 には NSColorクラスが 記 述 されています このような 宣 言 は 単 にクラス 名 を 型 として 使 用 しているだけで クラスインターフェイスの 詳 細 (メソッドとインスタンス 変 数 )には 依 存 しないため 引 数 として 何 が 期 待 されているかをコンパイ ラに 予 告 するには@classディレクティブで 充 分 です しかし クラスのインターフェイスを 実 際 に 使 用 する 場 面 では(インスタンスの 作 成 メッセージの 送 信 ) クラスインターフェイスをインポー トする 必 要 があります 通 常 インターフェイスファイルで@classを 使 ってクラスを 宣 言 し (そ れらのクラスのインスタンスを 作 成 したり メッセージを 送 信 する 必 要 があるため) 対 応 する 実 装 ファイルでそれらのインターフェイスをインポートします 39

クラスの 定 義 クラス 実 装 @classディレクティブは コンパイラとリンカによって 参 照 されるコードの 量 を 最 小 限 に 抑 えるた め クラス 名 の 前 方 宣 言 を 行 う 最 も 簡 潔 な 方 法 です 簡 潔 であるため ほかのファイルをインポート するファイルのインポートに 伴 う 潜 在 的 な 問 題 が 回 避 されます たとえば あるクラスが 別 のクラス の 静 的 に 型 定 義 されたインスタンス 変 数 を 宣 言 していて それぞれのインターフェイスファイルが 互 いをインポートすると どちらのクラスも 正 しくコンパイルされない 可 能 性 があります インターフェイスの 役 割 インターフェイスファイルの 目 的 は 新 しいクラスをほかのソースモジュール(およびほかのプログ ラマ)に 対 して 宣 言 することです インターフェイスファイルには クラスを 使 用 するのに 必 要 な 情 報 が 含 まれています(いくらか 文 書 化 されていればプログラマにも 歓 迎 されるでしょう) インターフェイスファイルは クラスが 継 承 階 層 にどのように 結 び 付 いていて どのようなクラ スがほかに 必 要 となるか( 継 承 するか クラスのどこかで 参 照 するか)をユーザに 知 らせます メソッド 宣 言 のリストを 通 して インターフェイスファイルはほかのモジュールに どのような メッセージをクラスオブジェクトとクラスインスタンスに 送 信 できるかを 知 らせます クラス 定 義 の 外 部 で 使 用 できるすべてのメソッドを インターフェイスファイルで 宣 言 します クラス 実 装 の 内 部 で 使 用 するメソッドは 省 略 できます クラス 実 装 クラスの 定 義 は 宣 言 と 非 常 によく 似 た 構 造 になります @implementationディレクティブで 始 ま り @endディレクティブで 終 わります クラスにはさらに @implementationディレクティブのあ とに 波 括 弧 ではさんでインスタンス 変 数 を 宣 言 しても 構 いません @implementation ClassName { // インスタンス 変 数 の 宣 言 } // メソッド 定 義 @end インスタンス 変 数 は 宣 言 済 みプロパティで 指 定 することもよくあります( 宣 言 済 みプロパ ティ (67 ページ)を 参 照 ) ほかにインスタンス 変 数 を 宣 言 しないのであれば 波 括 弧 は 省 略 して も 構 いません @implementation ClassName 40

クラスの 定 義 クラス 実 装 // メソッド 定 義 @end 注 : すべての 実 装 ファイルは 自 身 のインターフェイスをインポートする 必 要 があります たとえば Rectangle.mはRectangle.hをインポートします 実 装 はインポートする 宣 言 を 繰 り 返 す 必 要 がないため スーパークラス 名 は 省 略 しても 支 障 ありません クラスのメソッドは C 関 数 のように 一 対 の 中 括 弧 内 に 定 義 します 中 括 弧 の 前 には インターフェ イスファイルの 場 合 と 同 じ 方 法 でメソッドを 宣 言 しますが セミコロンは 不 要 です 次 に 例 を 示 しま す + (id)alloc { }... - (BOOL)isFilled { }... - (void)setfilled:(bool)flag { }... 可 変 個 パラメータをとるメソッドは 関 数 が 行 うのと 同 じようにパラメータを 処 理 します #import <stdarg.h>... - getgroup:group,... { va_list ap; va_start(ap, group);... } 41

クラスの 定 義 クラス 実 装 インスタンス 変 数 の 参 照 デフォルトでは インスタンスメソッドの 定 義 は 有 効 範 囲 内 にあるオブジェクトのインスタンス 変 数 をすべて 持 っています インスタンスメソッドは 名 前 だけでインスタンス 変 数 を 参 照 することが できます コンパイラはインスタンス 変 数 を 格 納 するためにCの 構 造 体 と 同 等 のものを 作 成 しますが 構 造 体 の 詳 細 は 隠 されています オブジェクトのデータを 参 照 するのに どちらの 構 造 体 演 算 子 (. または->)も 必 要 ありません たとえば 次 のメソッド 定 義 はレシーバのfilledインスタンス 変 数 を 参 照 します - (void)setfilled:(bool)flag { filled = flag;... } 受 信 側 オブジェクトも そのfilledインスタンス 変 数 も このメソッドのパラメータとして 宣 言 さ れていませんが このインスタンス 変 数 は 有 効 範 囲 内 に 入 っています このようなメソッド 構 文 の 簡 素 化 によって Objective-Cコードの 記 述 は 非 常 に 簡 潔 で 分 かりやすくなっています インスタンス 変 数 がレシーバでないオブジェクトに 属 する 場 合 は オブジェクトの 型 を 静 的 な 型 定 義 によってコンパイラに 明 示 しなければなりません 静 的 に 型 定 義 したオブジェクトのインスタンス 変 数 を 参 照 するには 構 造 体 ポインタ 演 算 子 (->)を 使 用 します たとえば Siblingクラスで 静 的 に 型 定 義 したオブジェクトtwinを インスタンス 変 数 として 宣 言 す るとします @interface Sibling : NSObject { Sibling *twin; int gender; struct features *appearance; } 静 的 に 型 定 義 したオブジェクトのインスタンス 変 数 がクラスの 有 効 範 囲 内 にあれば(twinが 同 じクラ スに 型 定 義 されているため この 例 ではインスタンス 変 数 が 有 効 範 囲 内 にあります) Siblingメ ソッドはインスタンス 変 数 を 直 接 設 定 することができます - makeidenticaltwin 42

クラスの 定 義 クラス 実 装 { if (!twin ) { twin = [[Sibling alloc] init]; twin->gender = gender; twin->appearance = appearance; } return twin; } インスタンス 変 数 の 有 効 範 囲 オブジェクトがそのデータを 隠 すことができるように コンパイラはインスタンス 変 数 の 有 効 範 囲 を 制 限 します つまり プログラム 内 でのインスタンス 変 数 の 可 視 性 を 制 限 します しかし 柔 軟 性 を 提 供 するために 有 効 範 囲 を4 段 階 で 明 示 的 に 設 定 することもできます 各 段 階 はコンパイラディレ クティブで 指 定 します ディレクティ ブ @private @protected @public @package 意 味 インスタンス 変 数 は それを 宣 言 するクラス 内 でのみアクセスできます インスタンス 変 数 は それを 宣 言 するクラス 内 および 継 承 するクラス 内 でア クセスできます 明 示 的 な 有 効 範 囲 ディレクティブのないインスタンス 変 数 の 有 効 範 囲 はすべて@protectedです インスタンス 変 数 は どこからでもアクセスできます 最 新 のラインタイムを 使 用 すると @packageインスタンス 変 数 の 有 効 範 囲 は そのクラスを 実 装 する 実 行 可 能 イメージ 内 では@publicであり クラス を 実 装 するイメージの 外 側 では@privateとして 作 用 します Objective-Cインスタンス 変 数 の 有 効 範 囲 @packageは Cの 変 数 と 関 数 の private_externに 似 ています クラス 実 装 のイメージの 外 側 のコードからイ ンスタンス 変 数 を 使 用 しようとすると すべてリンクエラとなります この 有 効 範 囲 は フレームワーククラス 内 のインスタンス 変 数 に 最 も 役 立 ち ます フレームワーククラスでは @privateでは 制 限 が 厳 しすぎるが @protectedや@publicでは 制 限 が 緩 すぎるという 場 合 があります 43

クラスの 定 義 クラス 実 装 図 2-1に 有 効 範 囲 のレベルを 示 します 図 2-1 インスタンス 変 数 の 有 効 範 囲 (@packageは 図 示 していません) The class that declares the instance variable @private @protected A class that inherits the instance variable @public Unrelated code 有 効 範 囲 ディレクティブは それ 以 降 次 のディレクティブまたはリストの 終 わりまでの 間 に 記 述 さ れたインスタンス 変 数 に 適 用 されます 次 の 例 では ageおよびevaluationインスタンス 変 数 は @private name job およびwageは@protected bossは@publicです @interface Worker : NSObject { char *name; @private int age; char *evaluation; @protected id job; float wage; @public id boss; } デフォルトでは 無 指 定 のインスタンス 変 数 ( 上 記 のnameなど)はすべて@protectedです 44

クラスの 定 義 クラス 実 装 クラスで 宣 言 するインスタンス 変 数 はすべて どのような 指 定 をされていても クラス 定 義 の 有 効 範 囲 内 にあります たとえば 上 記 のWorkerクラスのように jobインスタンス 変 数 を 宣 言 するクラス は メソッド 定 義 で 当 該 変 数 を 参 照 することができます - promoteto:newposition { id old = job; job = newposition; return old; } 言 うまでもなく クラスが 自 身 のインスタンス 変 数 にアクセスできなければ インスタンス 変 数 は 何 の 意 味 もありません 通 常 は クラスは 継 承 したインスタンス 変 数 にもアクセスできます インスタンス 変 数 を 参 照 する 能 力 は 通 常 変 数 とともに 継 承 されます クラスがデータ 構 造 全 体 をその 有 効 範 囲 内 に 保 つことは クラス 定 義 を 継 承 元 のクラスを 詳 細 化 するものと 考 えている 場 合 には 特 に 意 味 があります 上 記 の promoteto:メソッドは Workerクラスからjobインスタンス 変 数 を 継 承 するクラスであれば 同 様 に 定 義 することができます しかし 継 承 先 のクラスによるインスタンス 変 数 への 直 接 アクセスを 制 限 するべき 場 合 があるそれな りの 理 由 があります サブクラスの 中 で 継 承 したインスタンス 変 数 にアクセスすると 当 該 変 数 を 宣 言 するクラスがサ ブクラスの 実 装 の 一 部 に 縛 られるようになります 後 のバージョンで サブクラスを 不 用 意 に 壊 すことなく 当 該 変 数 をなくしたり その 役 割 を 変 更 することはできません さらに サブクラスにおいて 継 承 したインスタンス 変 数 にアクセスしてその 値 を 変 更 すると 特 に 変 数 がクラス 内 部 の 依 存 関 係 に 関 わっている 場 合 は 変 数 を 宣 言 したクラスに 不 用 意 にバグが 持 ち 込 まれる 可 能 性 があります インスタンス 変 数 の 有 効 範 囲 を 当 該 変 数 を 宣 言 するクラスに 限 定 するには そのインスタンス 変 数 を@privateとして 指 定 する 必 要 があります @privateとして 指 定 されたインスタンス 変 数 は パブ リックアクセサメソッドが 存 在 する 場 合 に それらを 呼 び 出 すことによってのみサブクラスから 利 用 できます 逆 に 変 数 を@publicとして 指 定 すると その 変 数 を 継 承 したり 宣 言 したりするクラス 定 義 の 外 でも 広 く 利 用 可 能 になります 通 常 ほかのオブジェクトがインスタンス 変 数 内 の 情 報 を 取 得 するには 情 報 を 要 求 するメッセージを 送 信 する 必 要 があります しかし パブリックインスタンス 変 数 は C 構 造 体 のフィールドであるかのように どこからでもアクセスすることができます 次 に 例 を 示 しま す 45

クラスの 定 義 selfとsuperに 対 するメッセージ Worker *ceo = [[Worker alloc] init]; ceo->boss = nil; オブジェクトは 静 的 に 型 定 義 する 必 要 があることに 注 意 してください インスタンス 変 数 を@publicとして 指 定 すると オブジェクトによる 当 該 データの 隠 蔽 が 無 効 になり ます これは 表 示 や 不 用 意 な 間 違 いからデータを 保 護 するためオブジェクト 内 にカプセル 化 すると いう オブジェクト 指 向 プログラミングの 原 則 に 反 します したがって 特 別 な 場 合 を 除 いて パブ リックインスタンス 変 数 の 使 用 は 避 けるべきです selfとsuperに 対 するメッセージ Objective-Cでは メソッドを 実 行 するオブジェクトを 参 照 するためにメソッド 定 義 内 で 使 用 できる2 つのキーワード selfとsuperが 提 供 されています たとえば 操 作 対 象 となるすべてのオブジェクトの 座 標 を 変 更 する 必 要 がある repositionメソッ ドを 定 義 するとします このメソッドは 変 更 を 行 うsetOrigin::メソッドを 呼 び 出 すことができま す 必 要 な 処 理 は repositionメッセージ 自 体 の 送 信 先 と 同 じオブジェクトにsetOrigin::メッセー ジを 送 信 することだけです repositionのコードを 記 述 する 際 には そのオブジェクトをselfまたは superのいずれかとして 参 照 することができます repositionメソッドは 次 のいずれかのように 記 述 できます - reposition {... [self setorigin:somex :somey];... } または - reposition {... [super setorigin:somex :somey];... 46

クラスの 定 義 selfとsuperに 対 するメッセージ } この 場 合 どのようなオブジェクトであっても selfとsuperはどちらもrepositionメッセージを 受 信 するオブジェクトを 参 照 します ただし この2つのキーワードはまったく 異 なるものです self は メッセージングルーチンがすべてのメソッドに 渡 す 隠 しパラメータの1つであり インスタンス 変 数 の 名 前 と 同 じように メソッド 実 装 内 で 自 由 に 使 用 できるローカル 変 数 です superは メッ セージ 式 のレシーバとして 使 われる 場 合 にのみselfの 代 わりに 使 用 できるキーワードです レシーバ として この2つのキーワードは 主 にメッセージング 処 理 に 与 える 影 響 が 異 なります selfは 受 信 側 オブジェクトのクラスのディスパッチテーブルから 始 まり 通 常 の 方 法 でメソッド 実 装 を 検 索 します 上 記 の 例 では repositionメッセージを 受 信 するオブジェクトのクラスから 検 索 を 始 めます superは まったく 異 なる 場 所 でメソッド 実 装 の 検 索 を 開 始 する 旨 を コンパイラに 指 示 するフ ラグです 検 索 は superが 出 現 するメソッドを 定 義 しているクラスのスーパークラスから 始 ま ります 上 記 の 例 では repositionが 定 義 されているクラスのスーパークラスから 検 索 が 始 まりま す superがメッセージを 受 信 した 場 合 は 常 に コンパイラはobjc_msgSend 関 数 の 代 わりに 別 のメッセー ジングルーチンを 使 用 します この 代 替 ルーチンは メッセージを 受 信 したオブジェクトのクラスで はなく 定 義 クラスのスーパークラス(superにメッセージを 送 信 したクラスのスーパークラス)を 直 接 参 照 します 例 :selfとsuperの 使 用 selfとsuperの 違 いは 3つのクラスの 階 層 を 使 用 するときに 明 確 になります たとえば Lowという クラスに 属 するオブジェクトを 作 成 するとします LowのスーパークラスはMidであり Midのスー パークラスはHighです 3つのクラスすべてにnegotiateというメソッドを 定 義 し 各 クラスはそれ 47