Objective-C言語のメモ書き(1)

2010. 02. 16
いよいよ本題のObjective-C言語のお話です。

Objective-C言語は『C言語にオブジェクト指向機能を付加したもの』と説明されます。

実際、iPhone OSのフレームワークがC言語とObjective-C言語のものが混在しており、プログラムでも両言語の記述が混在しています。

●id型

iPhone SDKの教科書』の本文中、唐突に『id型』の話が出てくるので補足します。

id型:クラスオブジェクトとインスタンスオブジェクトのデータ構造体への汎用ポインタ

基本的に変数もメソッドも、オブジェクトからの戻り値は(指定しない限り)全てid型を返します。

ただ全てid型で宣言してしまうとプログラムする側の可読性が落ちますので、明示できるものはクラス型を宣言した方がいいそうです。

id型はポインタですが、宣言時に*(アスタリスク)を付ける必要はありません。

●変数宣言とメソッド呼び出し

・変数の宣言(C言語と同じ):変数の型 変数名;
・オブジェクトの変数の宣言(変数型を指定する場合):クラス名 *変数名;
・オブジェクトの変数の宣言(変数型を指定しない場合):id 変数名;
・オブジェクトの変数への文字列の代入:変数名 = @"文字列";
・オブジェクトの変数やメソッドはポインタで宣言するので、使用時にはアスタリスクを付け無い
・オブジェクトのメソッド呼び出し(戻り値が無い場合):[オブジェクト メソッド];
・オブジェクトのメソッド呼び出し(戻り値が有る場合):変数 = [オブジェクト メソッド];
・オブジェクトのメソッド呼び出し(引数が1つの場合):
   [オブジェクト メソッド:(引数型)引数名];
・オブジェクトのメソッド呼び出し(引数が2つの場合):
   [オブジェクト メソッド:(引数1型)引数1名 キーワード名:(引数2型)引数2名];
・引数が3個以上の場合:キーワード名以降を同様に書く

引数が複数の際に突然現れるキーワード名(メッセージキーワード)ですが、本来引数が1つの時でも書くべきものを省略しているようです。
つまり、

[オブジェクト メソッド キーワード1:(引数1型)引数1名 キーワード2:(引数2型)引数2名];

と記述するはずのところ、『キーワード1』を端折ったと考えてください。

●インスタンスの生成と解放

・インスタンスの生成:インスタンス名 = [クラス名 生成メソッド];
・インスタンス生成メソッドは alloc
・インスタンスの初期化:インスタンス名 = [クラス名 初期化メソッド];
・インスタンス初期化メソッドは init 、または init で始まるメソッド
・初期化メソッドをイニシャライザ(Initializer)と呼ぶ
・インスタンスの解放:[インスタンス名 release];
・生成したインスタンスは必ず解放する。解放しないとメモリを確保したまま圧迫してしまう
   (所謂『メモリリーク』の状態になる)
・メソッド呼び出しの多重化(インスタンスの生成と初期化を同時に行うなど)
   インスタンス名 = [[クラス名 生成メソッド] 初期化メソッド];
・nil:NULLオブジェクトで、オブジェクトが未初期化あるいはクリアされた状態を表す
   (と、あるのですが、どういう時にどう使うのかさっぱりなので保留します)

●インスタンスの管理と自動解放

・リファレンスカウンタ(参照カウンタ)は、インスタンスが確保したメモリの要不要を示す値
・インスタンス生成時のリファレンスカウンタの初期値は1で、0になるとメモリを解放する
・releaseはリファレンスカウンタを1減らし、retain は1増やす
・オブジェクトをしばらく使いたいからメモリを解放したくない場合はretainでカウンタを増やす
・retainで増やした場合、releaseしてもカウンタが0にならず、解放されない場合もあるので注意
・インスタンス生成時にautoreleaseメソッドを呼び出し、処理完了後に自動解放させることもできる
・ただし、呼び出し側でretainされた場合、autoreleaseしても自動解放されないので注意
・自動解放はNSAutoreleasePoolクラスを使うので、プログラム中に処理記述が必要
(テンプレートから起こす場合は、自動でmain.mに書いてくれる)

●クラスとメソッド

・そのクラスにどのようなメソッドがあるかはヘッダファイルかリファレンスを見る必要がある
・メソッドにはクラスに対するクラスメソッドとインスタンスに対するインスタンスメソッドがある
・クラスメソッドの宣言、定義では行頭に + を書く
・インスタンスメソッドの宣言、定義では行頭に - を書く

●クラスの宣言

・Objective-C言語では、基本的にクラス毎にファイルを作る
・またクラス宣言を行うヘッダファイル(.h)とクラス実装を行うソースファイル(.m)を別に作る
・クラス宣言を行うヘッダファイル(.h)
#import <ヘッダファイル名>
@interface クラス名 : スーパークラス名
{
    インスタンス変数の宣言 ;
}
+ (戻り値の型)クラスメソッド ;
-  (戻り値の型)インスタンスメソッド ;
@end 
・元になるクラスのヘッダファイルの読み込み:#import
・クラス宣言の内容は、@interface と @end の間に記述する
・クラス名は必ず大文字から始まる
・元になるスーパークラスは必須(特に無い場合はルートクラスのNSObjectを設定する)
・メソッドの宣言(戻り値が有る場合):- (戻り値の型)メソッド名;
・メソッドの宣言(引数が1つの場合):- (戻り値の型)メソッド名 : (引数型)引数名;
・メソッドの宣言(引数が2つの場合):
   - (戻り値の型)メソッド名 : (引数1型)引数1名 キーワード名:(引数2型)引数2名;
・引数が3個以上の場合:キーワード名以降を同様に書く

●クラスの実装

・クラス実装を行うソースファイル(.m)
#import "ヘッダファイル名"
@implementation クラス名
- (戻り値の型)インスタンスメソッド名
{
    メソッドの実装
}
@end
・通常、ヘッダファイルはソースファイルとは別なので、ヘッダファイルを読み込む
・クラス実装(メソッドの処理)の内容は、@implementation と @end の間に記述する
・内部処理用のメソッドを記述する場合、@implementationの前にメソッドの宣言を行う
(内部処理用メソッドの宣言はヘッダファイルで行わなくてもよい)

※2010.3.12訂正
『- (戻り値の型)インスタンスメソッド名』が抜けていたため、追加しました。

※2010.6.1訂正
クラス実装の内容は『@interfaceと@endの間』と記述していましたが、『@implementationと@endの間』の間違いでした。お詫びして訂正いたします。



参考文献

Objective-C入門/静的な型

ダイナミックObjective-C/Objective-Cの動的型付け

@IT/Cocoaの素、Objective-Cを知ろう/第3回 Objective-Cのクラス定義を理解しよう

As Sloth As Possible/詳解Objective-C 2.0読書会に行ってきた

The comp.lang.objective-C FAQ listing 日本語訳

@IT/Cocoaの素、Objective-Cを知ろう/第7回 メモリ管理を理解する(前編)

iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
(2009/03/18)
赤松 正行

商品詳細を見る






bose_soundsport_free
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
09 | 2017/10 | 11
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

bose_soundsport_free
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR