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

2012年6月27日水曜日

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

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

以下ディレクティブ。

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

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

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

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

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


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

  1. @interface ObjA  
  2. {  
  3.   ObjB *objB;  
  4. }  
  5. @interface ObjB  
  6. {  
  1. @public  
  2.   BOOL a;  
  3. }  
  4.   
  5. @implementation ObjA  
  6. - (void)methodA:(BOOL)b  
  7. {  
  8.    objB->a = b;  
  9. }  

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

2012年6月24日日曜日

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

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

  1. #import "この実装のインタフェース.h"  
  2.   
  3. @implementation  クラス名  
  4. {  
  5.   インスタンス変数宣言  
  6. }  
  7. メソッド定義  
インスタンス変数宣言は必要なければ省略可能。その歳は{}も省略する。

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


可変パラメータのメソッド
関数と同じように処理する。以下参照。
  1. #import "stdarg.h"  
  2.   
  3. - (void)methods: param1, ... {  
  4.   va_list  ap;  
  5.   va_start(ap, param1);  
  6.   ....  
  7. }  

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

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

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

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

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

.

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

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

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

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

.