Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon Objective-C 基礎編 Vol3 (2010/05/05)
実家では、仕事場(商売屋なので)に行かないとネット使えないけど、部屋の場所によっては、無線LANのフリースポットが微妙に入ったり。
なんで、電波入るピンポイントを探してネットしてます(^^;) さて、続き

■*(アスタリスク)
個人的にObjective-Cで違和感がある書き方に「*(アスタリスク)」がある。
いわゆるC言語でいうポインタ。

自分はC言語はちゃんとやったことないので、それが違和感の原因かもしれないw
Webのオブジェクト指向プログラムでは、無意識にポインタ(参照)コーディング しているからであろう。

NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];

・クラスオブジェクト型のインスタンス変数は、「*」を付けて宣言 ・id型の場合は、「*」なしで宣言可能

■アクセス修飾子
@private 
int test1;
int test2;
@protected 
int test3;
@public 
int test4; 
int test5; 

・アクセス修飾子private、protected、publicは「@」ディレクティブとして宣言・Objective-Cのデフォルトはprotected
・次のディレクティブまたはリストの終わりまでの間に記述されたインスタン
ス変数に適用
・packageは64bitのみ


参考: Objective-C 2.0プログラミング言語:クラス実装
Objective-Cのアクセス制限とJavaのアクセス修飾子を比較してみる
これもちょっと違和感と言うか、パッとみわかりにくい気がする。
Java等はインスタンス変数の修飾子は1行で明示的にするのが作法なので、


@private int test1;
@private int test2;
@protected int test3;
@public int test4; 
@public int test5; 
あぁ、でも最初の方が合理的でいいのかな?(^^;)
あと、クラス自体のアクセス修飾子ってどうなんだろうか?
また機会がある時に調べないと。。。

■メッセージネスティング
これが、Objective-Cの「わかりにくさNo1」と個人的に思っていたり・・・。

NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];

これはよく出てくるコーディング。
alloc、init等は、新旧問わず暗黙的にネストして記述するようなので慣れるしかない。
--2010/07/17追記--
・alloc:メモリ確保
・init:初期化(NSObjectのメソッド)
メモリ管理によると、初期化のメッセージングを連続して書かないとnilを返す可能性があるとのこと。
オブジェクトを安全に初期化するには、割り当ておよび初期化メッセージを 1 行のコードに結合することが推奨されている。
------

ただ、以下のようにネストされるとやはり思考を停滞させられる。

[NSString stringWithFormat:@"%@ xxxxxxx", [sendertitleForState:UIControlStateNormal]];

個人的には「行数をただ減らせば良いってもんじゃない」と、「わかりやすさ重視派」なので。
(多分どの言語でもネストは悪だと思うんだけどねえ)

まぁ、コードって本当にその人の性格や思考回路が出ますねw
icon Objective-C 基礎編 Vol2 (2010/05/04)

実家に帰ってます。 てか、家の鍵が・・・色んな事に気を取られてダメダメです(^^;) えっと、ビックカメラで書籍買いました。 流石ブームだけあってかなり豊富(ネットだともっとあるんだけど) ・「はじめてのIphone3プログラミング」 まだ触りだけど、Objective-Cの新旧のコトなど突っ込んであって、深く理解するには感じかも?
・「そのまま使えるiPhoneゲームプログラミング

まだ全然読んでないけど、実用的なサンプルとOpenGL ESの勉強のために。 まずは、「はじめてのIphone3プログラミング」から。

Objective-C2.0からは、プロパティのアクセサメソッドを 自動生成させるためのコンパイラディレクティブが導入された。
Objective-Cが分かりにくいと言うカラクリは、コーディングを減らした結果にあるかも知れない。 今回は、アクセッサメソッドの基本について。

■@synthesize アクセサメソッド生成部分


@synthesize インスタンス,...;

■@property アクセサメソッド宣言部分
@property (nonatomic, retain) IBOutlet UIクラス *インスタンス
@property (assign) NSString *インスタンス;
@property (retain, readonly) NSString *インスタンス;
まずはよく出てくるセット

・nonatomic:マルチスレッド環境でオーバーヘッドを軽減。 複数のスレッドから同時に読み込み時の動作保障しない。 デフォルトはatomicだが属性なし。 ・retain:オブジェクトのメモリを勝手に解放しない



その他、

・assign:インスタンス変数に単純に代入・copy:インスタンス変数に引数をコピー
・readonly:getterのみを生成
・readwrite:setter、getter両方を生成(デフォルトで省略)



アクセッサーの処理を普通にコーディングすると、面倒なコードを書かなくて済む。<
- (id) foo {
    return foo;
}
- (void) setFoo:(id) aFoo {
    if (aFoo != foo) {
        [aFoo retain];
        [foo release];
        foo = aFoo;
    }
}

■ (id) sender InterfaceBuilder
- (IBAction) UIクラス:(id) sender

idはUIオブジェクトの「id」そのまま。
で、senderって何かの決まりと思ってたら、単なる引数名のことだった。

「センダー」と言う呼び名から、「sender」と書かれているサンプルが多い。
--2010/07/17追記--
いやいや、senderはUINibDeclarations.hのプロトコルのようです。
この通り記述しないとコンパイルエラーになります(^^;)
--2010/07/20追記--
またまた、間違い?
この前実装した時は、sender以外だとエラーになった(気のせい?)けど、今やったら普通に動く。。。
まぁ、混乱しない為にもsenderでいいと思う。

luvtechno
iPhone開発とかの備忘録。

なんだから覚える事が多いけど、実際何が行われているか?を理解しないと、 先に進めないので頑張らないと(^^;)
icon Objective-C 基礎編 Vol1 (2010/05/01)
触ってれば何となるかな?と思ったけど、 さすがにコーディングはJava系じゃないので厳しいわ。
文法がさっぱり馴染めない(T_T)
X-codeの使い方は何とかなりそうですが。

と言う事で、基礎の基礎からGW中にマスターするぞ!
帰省前に本買わなきゃいかんが、とりあえずネットで。

混沌のiPhoneアプリケーション工房を参考にさして貰いました。

コンパイラディレクティブ

>Objective-C 言語のクラスの宣言は、予約語や構文ではなく
>コンパイラディレクティブを利用します。 コンパイラディレクティブは、
>コンパイラに Objective-C で拡張されたクラスの宣言や実装などに用いられ、
>@ マークで始まるという特徴を持ちます。

ふむ。 @ってプロパティ(?)にも出てこなかったっけ?
それも含めてコンパイラディレクティブ? 取りあえず進む。

.hファイルの場合

クラスを宣言するコンパイラディレクティブは@interface で始まり@end .hはインターフェイス定義ファイルって理解でいいのかに?

@interface クラス名 : 親クラス名
{
	インスタンス変数宣言
}
メソッド宣言
@end

.mファイルの場合 .mは実装ファイル?

@implementation クラス名
メソッド定義
@end

メソッド宣言

- (戻り値型) メソッド名 : 仮引数リスト ... ;

・「-」で始まるメソッドをインスタンスメソッド(動的)・「+」 で始まるメソッドをスタティックメソッド(静的)
・メソッド宣言では型を 「( )」 で囲む
・メソッドが引数を受け取る場合は、コロン : に続いて仮引数リストを指定


この書き方が紛らわしい。
仮引数リストが、これまたよくわからん。

インスタンス生成・メッセージ式

一般的なオブジェクト指向型言語では new 演算子が存在するが、Objective-Cにはない!
って事で登場するのが「alloc クラスメソッド」(ファクトリメソッド)。
インスタンス生成はルートクラスが管理し「+ alloc;」として定義されている。

そして「メッセージ式」と呼ばれる方法で、以下のように呼び出す。

[クラス名 メソッド名:引数リスト...]

なるほど!これが「動的なメソッドの呼び出し」ってことなのね。
処理に時間はかかるが、合理的な記述ができるというカラクリか。

インスタンス参照を使わず、メッセージを入れ子にしてメッソドを呼び出す。

[[Test alloc] method]

なるほど!なるほど!
いまさら何か書いてるコードの意味が理解できてきた!
でも、やっぱ見にくくないかい?w

<< 最初 < 前ページ 次ページ > 最後 >>