とりあえず

メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2012年6月27日水曜日

[Objective-C][お勉強][メモ]インスタンス変数の有効範囲

特に何も指定しなかったときのインスタンス変数の有効範囲は@protectedと同等。

以下ディレクティブ。

ディレクティブ意味
@privateクラス内でのみアクセス可能
@protectedクラス内と、その継承されたクラスでのみアクセス可能
@publicどこからでもアクセス可能
@package意味不明

@packageは意味不明。private_externが何なのか知らない。
シンボルテーブルには登録しないってやつ?
androidの@hideみたいな感じ?

[Objective-C][お勉強][メモ] インスタンス変数の参照

レシーバが持つインスタンス変数への参照
インスタンス変数の名前そのままでアクセス可能。

- (void)setA:(BOOL)b
{
   a = b;
}
レシーバが保持しているインスタンス変数aへアクセス


レシーバ以外が所有するインスタンス変数への参照
レシーバ以外が所有するインスタンス変数の場合、そのオブジェクトを静的に型定義しなければならない。静的に型定義したオブジェクトのインスタンス変数への参照は構造体ポインタ演算子(->)を使う。

@interface ObjA
{
  ObjB *objB;
}
@interface ObjB
{
@public
  BOOL a;
}

@implementation ObjA
- (void)methodA:(BOOL)b
{
   objB->a = b;
}

もちろん、そのインスタンス変数が有効範囲にあることが前提。

2012年6月24日日曜日

[Objective-C][お勉強][メモ] クラス実装

@implementationで始まり、@endで終わる。

#import "この実装のインタフェース.h"

@implementation  クラス名
{
  インスタンス変数宣言
}
メソッド定義

インスタンス変数宣言は必要なければ省略可能。その歳は{}も省略する。

メソッド定義
メソッドは{}の間に定義する。以下参照。
- (型)メソッド名 {
  // ここに実装を定義
}



可変パラメータのメソッド
関数と同じように処理する。以下参照。
#import "stdarg.h"

- (void)methods: param1, ... {
  va_list  ap;
  va_start(ap, param1);
  ....
}

[Objective-C][お勉強][メモ] クラス参照

インタフェースが、その階層以外のクラス名を記述している場合は、

そのクラスのインタフェースファイルをインクルードするか、

@classディレクティブを記述する。

@class クラス名;
@class クラス名, クラス名;

@classディレクティブは、インタフェースをインクルードしない。
@classディレクティブは、クラス名が「クラス名」であることをコンパイラに知らせるだけ。
クラスのインタフェースを実際に使うのであれば、@classではなく、インタフェースをインクルードする必要あり。

.

[Objective-C][お勉強][メモ] インポート

インタフェースの場合、そのインタフェースに依存する全てのソースにincludeする必要がある。
インタフェースファイルは通常以下のようにincludeする。

#import "インタフェースファイル.h"

#importと#includeの違い
#importは2回以上includeされない。そのほかは#includeと同じ。

.

2012年6月23日土曜日

[Objective-C][お勉強][メモ]クラス定義

クラスは以下の2つに分けて定義する。

1) インタフェース
2) 実装

通常インタフェースと実装は別々のファイルとし、インタフェースは.h、実装は.mという拡張子をもつ。


インタフェース
インタフェースはディレクティブ@interfaceで始まり、ディレクティブ @endで終わる。
クラスのインタフェースは以下のように定義する。

@interface クラス名 : スーパクラス
{
  インスタンス宣言
}
メソッド宣言
プロパティ宣言
@end









メソッド宣言
クラスメソッド
先頭に"+"(プラス)をつける。
戻り値の型はC言語の型キャストの構文を使って記述する。
戻り値やパラメータの型を省略すると、デフォルトでidが使用される。
パラメータはメッセージと同様に名前の後のコロンの後に記述する。
+ (戻り値の型)メソッド名;
+(戻り値の型)メソッド名:(パラメータの型)パラメータ;
+(戻り値の型)メソッド名:(パラメータの型)パラメータ 名前:(パラメータの型)パラメータ;

インスタンスメソッド
先頭に"-"(マイナス)をつける。
戻り値の型はC言語の型キャストの構文を使って記述する。
戻り値やパラメータの型を省略すると、デフォルトでidが使用される。
パラメータはメッセージと同様に名前の後のコロンの後に記述する。
-(戻り値の型)メソッド名;
-(戻り値の型)メソッド名:(パラメータの型)パラメータ;
-(戻り値の型)メソッド名:(パラメータの型)パラメータ 名前:(パラメータの型)パラメータ;



可変パラメータをもつメソッド
Cと同様にカンマと省略記号を使って宣言する。
- (void)methoddayo:param1, ...;




プロパティ宣言
プロパティ宣言は以下のように記述する。
@property (attribute) Type propertyName;





インスタンス宣言
もともと必要だったが、今や実装ブロックやプロパティからの自動生成が可能なため、
通常はここでインスタンス宣言すべきでない、とのこと。
(波括弧も不要)


.



[Objective-C][お勉強][メモ]ソース上のクラス名

クラス名は以下の2つの場合にのみ使用できる。


1) 型名として使う場合

ObjA *objA;

等。

2) メッセージ式のレシーバとして使う場合
この場合のクラス名はクラスオブジェクトを意味する。

[ObjA alloc];

などなど。


また、クラス名はグローバル変数とネームスペースが同一のため、
同じ名前をつけることはできない。


.