「Objective-C」の版間の差分

削除された内容 追加された内容
編集の要約なし
13行目:
'''Objective-C'''(オブジェクティブ シー)は、[[プログラミング言語]]の一種。[[C言語]]をベースに[[Smalltalk]]型の[[オブジェクト指向]]機能を持たせた上位互換言語である。
 
Objective-Cは[[NeXT]]、[[OS X|Mac OS X]]の[[オペレーティングシステム|OS]]に標準付属する公式開発言語である。OS Xのパッケージ版に開発環境がDVDで付属するほか、ユーザ登録をすれば無償でダウンロードできる([[Xcode]]の項目参照)。現在では主に[[アップル  インコーポレイテッド|アップル]]のMac OS Xや[[iOS (アップル)|iOS]]上で動作するアプリケーションの開発で利用される。
 
== 概要 ==
Objective-CはCを拡張してオブジェクト指向を可能にしたというよりは、Cで書かれたオブジェクト指向システムを制御しやすいように[[マクロ (コンピュータ用語)|マクロ]]的な拡張を施した言語である。したがって、「better C」に進んだ[[C++]]とは異なり、「C & Object System」という考え方であり、ある意味2つの言語が混在した状態にある。
 
関数(メソッド)の定義と呼び出し方が独特であるため、Objective-Cのコードは一見C++以上にCとはかけ離れた独特の記述となる。しかし、言語仕様はCの完全上位互換であり、[[if文|if]]/[[for文|for]]/[[while文|while]]などの制御文や、intなどのスカラー型、[[サブルーチン#関数|関数]]記法、宣言・[[変数 (プログラミング)|代入]]といった基本的な文法はCに準拠する。一方オブジェクトシステムはSmalltalkの概念をほぼそのまま借用したもので、動的型のクラス型オブジェクト指向ランタイムを持ち、メッセージパッシングにより動作する。このことからしばしば「インラインでCの書けるSmalltalk」または「インラインでSmalltalkの書けるC」などと呼ばれる。Cとは異なるObjective-Cに特有の部分は、@で始まる'''コンパイラディレクティブ'''で明示され、オブジェクトのメソッド呼び出しは[]で囲まれた'''メッセージ式'''で行われる。
30行目:
|-
!クラス
|単一継承+インタフェース多重継承(プロトコル) 通常はルートクラスから継承
|-
!オブジェクトシステム
39行目:
|-
!実行速度
|コードはCと同等のネイティブコンパイル、メソッド呼び出しは動的ディスパッチを行なうのでやや遅延する。平均してC/C++より多少遅く、中間コード型言語(Java(Javaなど)より数倍程度高速といわれる。ただし、クリティカルな部分はいつでもCで書き直せるため、実行速度が問題になることはまずない。
|-
!その他
48行目:
Objective-Cは、[[1983年]]にBrad Coxによって開発され、そのコンパイラやライブラリを支援するためにStepstone社を創立した。Stepstone社は、Objective-Cに力を注いだが、それはマイナーな存在であった。Objective-Cが認知され始めるきっかけは、[[1985年]]、[[アップル インコーポレイテッド|アップルコンピュータ]]を去った[[スティーブ・ジョブズ]]が、m68k機であるNeXTコンピュータと[[NeXTSTEP]]オペレーティングシステムの開発を行うNeXT Computer社を創立したことに始まる。
 
そのマシンのユーザインタフェースは、[[Display PostScript]]と Objective-Cで書かれたApplication Kitにより提供され、Objective-CはNeXTコンピュータの主力言語となった。その後の歴史は、主にNeXT社とともにあり、[[GNUコンパイラコレクション|GCC]]をベースにしたObjective-Cサポートが行われ、プロトコルの導入など文法の拡張なども行われている。NeXT社による多くの成果は、GCCに還元されている。
 
1995年には、NeXT社がStepstone社からObjective-C言語と、その商標に関する全ての権利を買い取っている。1997年初頭、Apple社がNeXT社を買収し、2001年に登場したMac OS Xの[[Cocoa]][[アプリケーションフレームワーク|フレームワーク]]のコア言語として採用されている。[[Mac OS X v10.5]]からは一部言語仕様の変更が行われ'''Objective-C 2.0'''と呼ばれる(詳細は[[#Objective-C 2.0]]を参照)。
 
55 ⟶ 56行目:
== 基本的な構文 ==
=== メッセージ送信 ===
C++とは異なり、オブジェクトのメソッド呼びだしには新たな構文が導入されている。Objecitve-Cではこれをメッセージ式と呼び、メソッド呼びだしはメッセージ送信と呼ぶ。メッセージ送信は実行時のメッセージパッシングであり、その時渡されるメッセージ値をセレクタという。特徴的なのはSmalltalk同様キーワード引数形式をとることで、セレクタ名と引数値が交互に並んだ形態になる。なおSmalltalkにはあるカスケード式(一つのオブジェクトに続けてメッセージを送る)はない。
 
<source lang="objc">
// メッセージの送信
69 ⟶ 71行目:
Objective-Cのクラスは定義部と実装部に分かれており、通常定義部を.hファイル、実装部を.mファイルに記述する。後述のカテゴリによりクラス定義を複数のパートに分割できる。
 
<source lang="objc" style="margin-bottom: 1em;">
// クラスの定義 (MyObject.h)
@interface MyObject : NSObject {
80 ⟶ 82行目:
@end
</source>
 
<br />
 
<source lang="objc">
180行目:
 
類似した機構に実装をオプションにできるinformalプロトコルがある。これは後述のカテゴリのうち、インターフェース定義のみを利用する方法で、利用側は実装状態をリフレクションで調査して正当な場合のみ呼びだす。
 
<source lang="objc">
// ここでは「NSObjectにはtransferAcceptable:が定義されている」と宣言している
231 ⟶ 232行目:
 
==== Objective-C++ ====
Objective-CとC++が混在したもの。両者はCからの拡張部分がほぼ干渉しないため、お互いをただのポインタ値と見なすことで表記が混在できる。したがってクラスシステムの互換性はなく、単純なObjective-C &amp; C++になる。
 
[[サブルーチン|関数]]やObjective-C[[メソッド (計算機科学)|メソッド]]の内部では、Objective-CとC++両方の機能を任意に組み合わせて利用することができる。例えば、Objective-Cオブジェクトの寿命を管理する[[スマートポインタ]]を、C++の機能を用いて作成するようなことが可能である。他方、[[クラス (コンピュータ)|クラス]]の階層はObjective-CとC++で完全に分かれており、一方が他方を[[継承 (プログラミング)|継承]]することは全く不可能である。また、伝統的なObjective-Cの[[例外処理]]とC++のそれは互換性がなく、プログラマが両者を逐一捕捉・変換しなければ、[[メモリリーク]]や[[クラッシュ (コンピュータ)|クラッシュ]]につながる。
250 ⟶ 251行目:
 
==== メモリ管理 ====
初期のObjective-CプログラムはC同様単純な割当と解放を行なっていたが、現在は標準APIライブラリに実装された[[参照カウント]]を利用するのが標準的である。参照カウントによる自動[[ガベージコレクション]]とは異なり、参照カウンタの増加 (retain) と減少・開放 (release) は手動で扱う必要がある<ref>macやiOSの標準APIでは基底クラスNSObjectに参照カウントを実装してあり、他のクラスがNSObjectを継承している。
*[http://developer.apple.com/library/IOs/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html Apple IOs API Reference #NSObject] (2012-01-(2012年1月20 閲覧)
*[http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html Apple mac API Reference #NSObject] (2012-01-(2012年1月20 閲覧)
*[http://developer.apple.com/jp/devcenter/ios/library/documentation/MemoryMgmt.pdf 高度なメモリ管理プログラミングガイド(日本語)]</ref>
 
OPENSTEPライブラリはイベントサイクル単位で、Autorelease poolと呼ばれる暗黙の参照元を持っており、オブジェクトをここに登録することでイベント終了時には自動で解放されるオブジェクトを実現している。
 
GNU版ランタイム及び、Mac向けのApple版ランタイムではガベージコレクションも利用可能だが、iOSに於てはリソースの効率上使用できない。Appleはさらに第三の方式としてARC (Automatic Reference Counting) 方式を開発したため、Apple系では今後この方式が主流になる見込みである。
 
===== 自動参照カウント (ARC) =====
自動参照カウントは内部的にはretain/release/autoreleaseと同様のメカニズムで動作するが、コンパイル時にメソッドの命名ルール等を見て自動的にretain/release相当のコードを挿入する方式である。これにより、自動参照カウントでは明示的なretain/releaseがそもそも不可能になる。管理周りのコードの削減に加え、autorelease管理の実行効率が向上するため、旧方式のプログラムを自動参照カウントに切り替えるだけでもパフォーマンスがいくぶん向上する。
 
279 ⟶ 285行目:
* ''Object Oriented Programming: An Evolutionary Approach; Brad J. Cox, Andrew J. Novobilski; Addison-Wesley Publishing Company, Reading, Massachusetts, 1991; ISBN 0-201-54834-8''<br />(邦題:「オブジェクト指向のプログラミング」 ISBN 4-8101-8046-8)
 
この本はObjective-CのNeXTSTEPでの実装について記述している。 NeXTSTEPが明確なターゲットだが、Objective-Cを学習するためのよい入門書となる。
* ''NeXTSTEP Object Oriented Programming and the Objective C Language; Addison-Wesley Publishing Company, Reading, Massachusetts, 1993; ISBN 0-201-63251-9''<br />(邦題:「OBJECT-ORIENTED PROGRAMMING AND THE OBJECTIVE-C LANGUAGE (LANGUAGE(日本語版)」 ISBN 4-7952-9636-7)
 
多くの実例とともに、Stepstone版とNeXT版のObjective-Cについて、両者の違いを含めて論じている。
289 ⟶ 295行目:
 
== 外部リンク ==
* [http://developer.apple.com/documentation/cocoa/Conceptual/ObjectiveC/ The Objective-C Programming Language] ([http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/ 日本語訳])Apple Inc. - Objective-C言語とはどういうものかを知ることができる文書。
* [http://news.mynavi.jp/column/objc/ ダイナミックObjective-C] - [[マイナビニュース]]のコラム。