2010年4月29日木曜日

@property (プロパティ宣言)

さて、これまで何故Objective-Cに戻ったかというと、このやっかいなプロパティ宣言(というよりアウトレット宣言に必要なプロパティ宣言)を知るためでした。(道のりは長い...)

◆ヘッダファイル(abc.h):
@interface Object: Itssuper{
   type *name
}
@property(attributes) type *name; //(アクセス権限等) アクセサ型/名の宣言
@end

◆実行ファイル
#import "abc.h"
@implement Object
@synthesize name; //アクセサメソッドの合成指示
       // getterの名前は"name", setterの名前は"setName"となる
@end
---------------------------------
◆attributesについて
attributesには、「書き込み可能性」、「セッタの動作」、「アトミック性」を指定する。

(1)書き込み可能性(setアクセサメソッドを持つかどうか)
    readwrite 読み取り/書き込み可能(getter/setter双方を使用)
    readonly  読み取りのみ(getterのみ使用、代入禁止)

(2)セッタの動作(seterについての指定)
    assign   単純代入<スカラ型、デリゲート等> (default)
    retain メモリにsetterオブジェクトを保持する。
    copy   代入にオブジェクトのコピーを使用する。 NSCopyingプロトコルの実装要。
  
     NSString, NSNumber, NSValue などといったオブジェクトを値として扱っているようなときは、NSMutableString等での意図しない変更を抑止するため、copy を使用します。それ以外の場合は、retain です。NSWindow などといった、値が欲しいわけではなく、その参照に注目したいときです。 copy してしまうと、NSWindow が二つできてしまうので、このようなインスタンスを copy してはいけない。deligate等の循環参照の可能性がある場合は、assign(単純代入)を使用する。

(参考)http://lifeaether.homeunix.net/overtaker/blog/?p=1180

(3)アトミック性
     マルチスレッド環境の場合は指定なく、戻り値の保持と自動解放を行う。単に値を返すだけの場合はnonatomicを指定する。

Objective-Cにおけるオブジェクトの生成と解放(メモリ管理)

オブジェクト指向プログラムでは、生成するオブジェクトを解放しないでいると、メモリーリークを起こしてしまい、システムに影響を与えてしまうようです。
そのため、オブジェクトの生成と解放(メモリ管理)をプログラム側でしっかりとしてあげないといけないようです。

◆オブジェクトの生成(alloc メソッド)と初期化(init メソッド)
一般には、以下のコードで生成し、初期化します。
id obj = [ [objectType alloc ] init ];
オブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。

◆オブジェクトの保持(retain メソッド)
   オブジェクトを参照する場合、 他からの解放の危険を避けるため、明示的に保持(retain)を示すそうです。

この場合もオブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。


◆オブジェクトの解放(releaseメソッド)
   オブジェクトの登録が解除され、使用できなくなります。
これらの状態は、retainCountとよばれる保持数として管理されており、オブジェクトが無くなると「0」になります。
- (void)method
{
id obj = [[ObjectType alloc] init];//保持数 1
[obj retain];           //保持数 2
[obj release];        //保持数 1
[obj release];       //保持数 0 ... 解放されており、これ以降objは使用できない。
}
さらに、リリースを容易とするため、autoreleaseメソッドも準備されており、そのオブジェクトをautoreleaseすることで、プログラムの終了時に一度に解放してくれる仕組みがあるそうです。
また、途中でNSAutoreleasepoolオブジェクトを生成し、そのオブジェクトreleaseすると、プログラム終了をまたずとも、その間autoreleaseしたオブジェクトを解放してくれるそうです。

◆オブジェクトの廃棄(deallocメソッド) <アプリから呼び出してはならない>
保持数が0となったオブジェクトは、deallocメソッドが暗黙的に呼ばれて解放されるようです。オブジェクト固有のインスタンス変数がある場合はは、deallocメソッドをオーバライドし、固有インスタンスの解放を含め実装するようです。
- (void)dealloc
{
[koyu_instans_var  release]; // 固有インスタンス変数を解除
[super dealloc]; // 親クラスのdeallocを実行
}

くわしくは、こちらか、Appleの「Cocoaメモリ管理プログラムガイド」を参照ください。
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article01.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article02.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article03.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article04.html

2010年4月28日水曜日

Objective-Cの理解

iPhone開発には、Objective-Cの理解がかかせません。

Appleの発行する、「Objective-Cプログラミング言語」も良いのですが、より理解を深めるためにはこちらの書籍が良いようです。とりあえず立ち読みで読んでみたいと思います。

2010年4月25日日曜日

BubbleLevel(水準器)サンプルコード

AppleのDevelopperサイトには様々なサンプルコードがあります。

水準器のアプリが多いと思ったら、こんなサンプルコードがあるみたいですね。


ViewController基本概念

ViewControllerは、様々なビューをコントロールするためiPhone開発における以下の重要な役割を持ちます。
  • 画面が小さく、複数の画面に分散させる
  • 複数の画面を適切なタイミングで表示/非表示させる
そのため、この概念について予め把握しておく必要があります。

◆ViewControllerの種類
  • カスタムViewController:画面のタイプ毎にデータの型を変換(マーシャリング)し、表示を個別に管理するViewコントローラを作成する必要がある。
  • コンテナViewController : 他のViewControllerを管理する。Navigation ControllerTabBarControllerが該当する。システムが提供するものをそのまま使用する。
  • モーダルViewController : コンテナViewControllerと異なり、ユーザがView間の関係を定義する。あるViewControllerから表示される補助的なViewControllerで、呼び出されたあと呼び出したViewControllerに値を返す。
◆カスタムViewControllerの作り方
  • UIViewControllerから直接サブクラスを作成する
  • 直接コントロールするビューに対応するデータ等のインスタンス変数を宣言する。
  • やりとりが必要なビューオブジェクトを指すインスタンス変数を宣言する(アウトレット)<... どうも最近ではプロパティとして宣言するようです>。
  • 追加の動作に必要なメソッドを追加する。
  • 他から受けるアクションに必要なメソッドを追加する(アクション
   なお、アウトレット宣言は、IBOutletのみで宣言するのではなく、@property (nonatomic, retain) IBOutlet とするそうです。詳しくは、Appleの「Objective-C 2.0 プログラミング言語」に記載されているそうです。
----------------------------------------------------------------------------------
#import <  UIKit/UIKit.h >

@interface button_FunViewController : UIViewController {
   UILabel *statusText ;
}
@property (nonatomic, retain) IBOutlet UILabel *statusText ;
  - (IBAction) buttonPressed:(id)sender ;
@end
----------------------------------------------------------------------------------
    ◆共通するメソッド(UIViewController)
    • ビューの管理、インターフェイスの向きの管理、メモリ不足の警告等が含まれる。
      • ビューの管理では、一画面分のコンテンツを管理したり表示するための基本ロジックを提供する。
      • 一連のビューをプログラムの中で作成したり、nibファイルからロードしたりするためのワークフローを提供する。
      • メモリ管理では、メモリ不足状態の間は、これらのビューをメモリから削除し、後で必要になったときに再構築する処理を行う。
      • インターフェイスの向きの管理では、ユーザがデバイスを回転したときにインターフェイスの向きを変更する動作を提供する。
      • モーダルビューの基本機能として、現在のコンテンツの手前にほかのビューを一時的に表示する動作を提供する。
    • 必要に応じオーバライドして使用する。

    Model-Controller-Viewコンセプト

    iPhoneのライブラリは、MVC(Model-View-Controller)で構成する三層アプリケーション開発コンセプトに忠実に実装されているそうです。
    • Model : データを保持するクラス
    • View : ユーザが操作するウィンドウ等
    • Controller: ModelとViewを結びつけ、ユーザのインプットをどう処理するか決定するアプリケーションロジック
    iPhoneアプリケーションの場合、
    • Model : Core DataやSQL Lite等のクラスででデータを保持します。ネットワークからのデータの取得やストア、ロジックとは別のデータ変換等もこちらと思ったほうがいいかもしれません。
    • View :  UIKit、GameKit, MapKitなどのCoCoa例やのクラスで表示したり、Mediaレイヤのグラフィスクやオーディオ再生等もこちらと考えた方がいいかもしれません。
    • Controller : NSObjectクラス(ルートクラス)や、UIViewControllerのようなUIKitフレームワークから派生させたサブクラスで構成するのが一般的のようです。
    あとは、MVC間をコミュニケートする「プロトコル」も認識しておく必要がありそうです。

    ViewController.xib(nibファイル)

    Interface Builderをつかった場合、UIKitのインスタンスが「Resources」のViewController.xib(nibファイル)に格納され、呼び出されます。

    〜ViewController.xibをダブルクリックすると、InterfaceBuilderが起動するとともに、〜ViewController.xibの中身が見えます。

    中には、「File's Owner」、「First Responder」とベースとなるビュークラスのインスタンスが入っています。

    「File's Owner」がnibファイルを読み込むオブジェクト、「First Responder」はユーザが操作しているオブジェクトだそうです。それ以外がUIKitに含まれるクラスのユーザインタフェースのベースとなるインスタンスとなります。

      ここではUIViewクラスのインスタンス「View」です。この「View」をダブルクリックすると、画面イメージが表示されます。これをベースに作業を進めることになります。