Objective-C

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Objective-C
パラダイム オブジェクト指向プログラミング、マルチパラダイムプログラミング、クラスベースリフレクション ウィキデータを編集
登場時期 1984年 (40年前) (1984)
設計者 ブラッド・コックス
最新リリース 2.0 /
型付け 静的型付け動的型付け
主な処理系 Apple版、GNU版
影響を受けた言語 C言語Smalltalk ウィキデータを編集
影響を与えた言語 JavaSwiftObjective-J英語版GroovyNu英語版
プラットフォーム macOSGNUstep
ウェブサイト developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html ウィキデータを編集
拡張子 h、m、mm、C ウィキデータを編集
テンプレートを表示

Objective-C CSmalltalk

Objective-CNeXTmacOS (OS) macOSDVDXcodeApplemacOSiOS

[]


Objective-CCCbetter CC++C & Object System2

Objective-CC++CCif/for/whileintCSmalltalkCSmalltalkSmalltalkCCObjective-C@[]

id

COSCJavaCC++Objective-C使NEXTSTEPUNIXOS

Java姿OPENSTEP[1]
オブジェクトシステムの概要
クラス 単一継承+インタフェース多重継承(プロトコル) 通常はルートクラスから継承
オブジェクトシステム 動的束縛メタクラスを持つ
動的型+見た目の静的型のハイブリッド
実行速度 コードはCと同等のネイティブコンパイル、メソッド呼び出しは動的ディスパッチを行なうのでやや遅延する。平均してC/C++より多少遅く、中間コード型言語(Javaなど)より数倍程度高速といわれる。ただし、クリティカルな部分はいつでもCで書き直せるため、実行速度が問題になることはまずない。
その他 オブジェクトはポインタ互換、Cのスカラー型はオブジェクトではない

歴史[編集]


Objective-C1983Brad CoxTom Love[2]StepstoneStepstoneObjective-CObjective-C1985Apple Computerm68kNeXTNeXTSTEPNeXT Computer

Display PostScriptObjective-CApplication KitObjective-CNeXTNeXTGCCObjective-CNeXTGCC

1995NeXTStepstoneObjective-C1997AppleNeXT2001Mac OS XCocoaMac OS X v10.5Objective-C 2.0#Objective-C 2.0

NeXTmacOSiOS2008iPhone OSiOSAPIAppleLLVM/ClangGCCGNUstep

[]

[]


C++SmalltalkObjecitve-CSmalltalkSmalltalk
// メッセージの送信
// 単項メッセージ
[receiver msg];
// 引数付きメッセージ。この場合「msg:with:」でセレクタ一つ
val = [receiver msg: arg1 with: arg2];
// メッセージの入れ子
val = [obj1 msg: [obj2 msg]];

クラス定義[編集]

Objective-Cのクラスは定義部と実装部に分かれており、通常定義部を.hファイル、実装部を.mファイルに記述する。後述のカテゴリによりクラス定義を複数のパートに分割できる。

// クラスの定義 (MyObject.h)
@interface MyObject : NSObject
{
    int val;
    id obj;
}

+ (void)classMethod:(id)arg;  // クラスメソッド
- (id)method:(NSObject*)arg1 with:(int)arg2;  // インスタンスメソッド。arg1は型付き
@end
// 実装 (MyObject.m)
@implementation MyObject
+ (void)classMethod:(id)arg
{
    // some operation
}

- (id)method:(NSObject*)arg1 with:(int)args2
{
    return obj;
}

// 典型的なinit
- (id)init
{
    self = [super init]; // スーパークラスの呼びだし
    if(self != nil)
    {
        val = 1;
        obj = [[SomeClass alloc] init];
    }
    return self;
}

// deallocは自身のリソースを解放してからスーパークラスに回す
- (void)dealloc
{
    [obj release];
    [super dealloc];
}
@end

+-使使

+alloc-init-dealloc使-finalize

self-init

idpublicprotectedprivateprotected

[]


32bitLinuxGCCNSObjectObject使64bitObjectNSObject使GNUStep#import<Foundation/NSObject.h>ObjectNSObject-lobjc-lgnustep-base

[]

[]


Objective-C

リフレクションの一部[編集]

- (BOOL)respondsToSelector:(SEL)aSel;
- (BOOL)isKindOfClass:(Class)cls;

転送[編集]

実装系によるが、存在しないメソッドを呼びだした際、例外を発生する前にそれを他のオブジェクトに転送するチャンスが与えられる。Message Forwardingと呼ばれる。

転送の例[編集]

Appleのランタイムでは、セレクタに対応する引数情報と転送処理の二つの過程を経て行われる。

// NSMethodSignatureはメソッドの引数の数や型情報を表すオブジェクト
// Objective-Cのメソッドはスカラー型をとるC関数互換なので正確なスタック情報が必要となる
- (NSMethodSignature*)methodSignatureForSelector:(SEL)sel
{
    id signature = [otherObj methodSignatureForSelector: sel];
    return signature;
}

// NSInvocationはターゲットと引数を持ち、返値を受け取るオブジェクト
// 元のターゲットの代わりに別のターゲットで実行を行なうとあたかもそのオブジェクトにメッセージが送られたかのように動作する

- (void)forwardInvocation:(NSInvocation*)invocation
{
    SEL aSel =  [invocation selector];
    if([otherObj respondsToSelector: aSel])
    {
        [invocation invokeWithTarget: otherObj];
    }
    else
    {
        [self doesNotRecognizeSelector: aSel];
    }
}

プロトコル[編集]

プロトコルはクラスのメソッドインターフェースを規定する機構である。元々はNeXTワークステーション上で分散オブジェクトシステムを構成する際、リモートオブジェクトの通信効率を上げるために導入された。

プロトコルに準拠するクラスは定義されたメソッドを全て実装しなければならない。また、プロトコルは多重継承を許す。

プロトコルの例[編集]

// プロトコルを定義する
@protocol MyProtocol <NSObject, NSCopying>
- (void)methodForRespond;
@end

// プロトコルを導入する
@interface MyObject <MyProtocol>
...
@end

類似した機構に実装をオプションにできるinformalプロトコルがある。これは後述のカテゴリのうち、インターフェース定義のみを利用する方法で、利用側は実装状態をリフレクションで調査して正当な場合のみ呼びだす。

// ここでは「NSObjectにはtransferAcceptable:が定義されている」と宣言している
// 実際には対応する実装を用意する義務がないため、NSObjectを継承したオブジェクトがそれを行なった場合のみ利用できる
@interface NSObject (OptionalMethods)
- (BOOL)transferAcceptable:(id)obj;
@end

- (void)method
{
    id val,obj;
    ...
    if([obj respondsToSelector: @selector(transferAcceptable:)])
    {
        [obj transferAcceptable: val];
        ...
    }
}

カテゴリ[編集]


Smalltalk使()



Informal


カテゴリの例[編集]

@interface NSObject (BetterHash)
- (unsigned)hash;
@end

@implementation NSObject (BetterHash)
// 子孫クラスのうち、独自のオーバーライドのない-hashは全てこの実装に置き換わる
- (unsigned)hash
{
    return better_hash_function(self);
}
@end

メモリ管理[編集]


Objective-CCAPIAutorelease pool

NSAutoreleasePoolautoreleasereleaseNSAutoreleasePool[3]

(objA)()autoreleaseobjAautoreleaseNSAutoreleasePoolreleaseobjANSStringstringWithCString:autorelease

手動管理の場合[編集]

int count = 0;

// オブジェクトのインスタンス化
// これら2つは自動的に参照カウントが1になる
id objFoo = [[Foo alloc] init];
id objBar = [[Bar alloc] init];
id baz = objFoo; // Fooを間接参照
id qux = objBar; // Barを間接参照
[baz retain]; // Fooの参照カウントは2になる

// オブジェクトの解放
[objFoo release]; // objFooは解放されるがFooの参照カウントは1で維持される
[objBar release]; // 変数quxはretainしていないのでBarは破棄される
[baz release]; // Fooが解放される
count = [qux retainCount]; // Barの参照カウントを参照する。Barは解放されているのでエラー

NSAutoreleasePoolの例[編集]

int count = 0;

// NSAutoreleasePoolのインスタンス化
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id objFoo = [[Foo alloc] init];
id objBar = [[Bar alloc] init];
id objBaz = [[Baz alloc] init];

// Autorelease poolに登録
[objFoo autorelease];
[objBar autorelease];
[objBaz autorelease];

// オブジェクトを参照する変数
id qux = objFoo;
id fooBar = objBar;
[qux retain]; // FooのretainCountは2

// Autorelease poolの解放
[pool release];
count = [qux retainCount]; // Fooをretain後オーナーだったobjFooが解放されたので1
count = [fooBar retainCount]; // Barをretainしていないのでエラー
count = [objBaz retainCount]; // ほかの参照がなかったので解放済み。エラー
count = [objBar retainCount]; // fooBarがretainしていなかったのでエラー

()retainautoreleasepoolreleaseobjqux

OPENSTEPAutorelease poolMacNSApplicationNSAutoreleasePoolNSApplication

GNUMacApple(Objective-C 2.0)iOS使AppleARC (Automatic Reference Counting) OS X 10.11[4]AppleARC

 (ARC)[]


retain/release/autoreleaseretain/releaseretain/releaseautorelease

[]

[]


CCObjective-CObjective-C

posing



method swizzling



IMP

C

Objective-C++[]


Objective-CC++CObjective-C & C++.mm

Objective-CObjective-CC++Objective-C寿C++Objective-CC++Objective-CC++

C++Objective-CAppleWebKitKHTML

[]


Objective-CC

SmalltalkHaskellJavaPerl[]PythonPyObjCRubyRubyCocoa

処理系の特性[編集]

  • Apple/NeXT版
  • GNU版
  • Portable Objective-C版

Objective-C 2.0[]


AppleMac OS X v10.5Objective-C 2.0



GCGCCore FoundationGCGC

OS X 10.11[4]



C#setter/getterKey-Value-Codingobj.propNameObjective-C

Fast Enumeration

foreach





Class Extensions

Objective-C



posing

[]



(一)^ OS - 1990NeXTSTEP. (2012628). 20231113

(二)^ Why Objective-C? (). developer.apple.com. 201846

(三)^ maciOSAPINSObjectNSObject
Apple IOs API Reference #NSObject2012120

Apple mac API Reference #NSObject2012120



 Mac OS X  Objective-C,2001,ISBN 4-87778-068-8

(四)^ abXcode Release Notes | Xcode 8.3 (). 202177

参考文献[編集]


Objective-CObjective-C

Object Oriented Programming: An Evolutionary Approach; Brad J. Cox, Andrew J. Novobilski; Addison-Wesley Publishing Company, Reading, Massachusetts, 1991; ISBN 0-201-54834-8
: ISBN 4-8101-8046-8

Objective-CNeXTSTEPNeXTSTEPObjective-C

NeXTSTEP Object Oriented Programming and the Objective C Language; Addison-Wesley Publishing Company, Reading, Massachusetts, 1993; ISBN 0-201-63251-9
:OBJECT-ORIENTED PROGRAMMING AND THE OBJECTIVE-C LANGUAGE ISBN 4-7952-9636-7

StepstoneNeXTObjective-C

Objective-C: Object Oriented Programming Techniques; Lewis J. Pinson, Richard S. Wiener; Addison-Wesley Publishing Company, Reading, Massachusetts, 1991; ISBN 0-201-50828-1
:OBJECTIVE-C  ISBN 4-8101-8054-9

Objective-CC++SmalltalkObject PascalJava
  • An Introduction to Object-Oriented Programming; Timothy Budd; Addison-Wesley Publishing Company, Reading, Massachusetts; ISBN 0-201-54709-0
    (邦題:「オブジェクト指向プログラミング入門」 ISBN 4-8101-8048-4

外部リンク[編集]