tag:blogger.com,1999:blog-11955845938232405362024-02-03T04:28:29.816+09:00とりあえずメモ代わり。てきとーに。
いや、ですからてきとーですって。
2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.comBlogger664125tag:blogger.com,1999:blog-1195584593823240536.post-34482311638711092032012-06-27T23:10:00.000+09:002012-06-27T23:10:03.082+09:00[Objective-C][お勉強][メモ]インスタンス変数の有効範囲特に何も指定しなかったときのインスタンス変数の有効範囲は@protectedと同等。<br />
<br />
以下ディレクティブ。<br />
<table border=1>
<tr><th>ディレクティブ</th><th>意味</th></tr>
<tr><td>@private</td><td>クラス内でのみアクセス可能</td></tr>
<tr><td>@protected</td><td>クラス内と、その継承されたクラスでのみアクセス可能</td></tr>
<tr><td>@public</td><td>どこからでもアクセス可能</td></tr>
<tr><td>@package</td><td>意味不明</td></tr>
</table>
<br />
@packageは意味不明。private_externが何なのか知らない。<br />
シンボルテーブルには登録しないってやつ?<br />
androidの@hideみたいな感じ?<br/>
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-18008223134798226482012-06-27T22:43:00.001+09:002012-06-27T22:44:16.175+09:00[Objective-C][お勉強][メモ] インスタンス変数の参照<b>レシーバが持つインスタンス変数への参照</b><br />
インスタンス変数の名前そのままでアクセス可能。<br />
<pre class="C" name="code">- (void)setA:(BOOL)b
{
a = b;
}
</pre>
レシーバが保持しているインスタンス変数aへアクセス
<br />
<br />
<br />
<b>レシーバ以外が所有するインスタンス変数への参照</b><br />
レシーバ以外が所有するインスタンス変数の場合、そのオブジェクトを静的に型定義しなければならない。静的に型定義したオブジェクトのインスタンス変数への参照は<b>構造体ポインタ演算子(->)</b>を使う。<br />
<br />
<pre class="C" name="code">@interface ObjA
{
ObjB *objB;
}
@interface ObjB
{</pre>
<pre class="C" name="code">@public
BOOL a;
}
@implementation ObjA
- (void)methodA:(BOOL)b
{
objB->a = b;
}
</pre>
<br />
もちろん、そのインスタンス変数が有効範囲にあることが前提。<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-3829383412416636182012-06-24T05:24:00.000+09:002012-06-24T05:24:27.369+09:00[Objective-C][お勉強][メモ] クラス実装@implementationで始まり、@endで終わる。<br />
<pre class="C" name="code">#import "この実装のインタフェース.h"
@implementation クラス名
{
インスタンス変数宣言
}
メソッド定義
</pre>
インスタンス変数宣言は必要なければ省略可能。その歳は{}も省略する。<br />
<br />
<b>メソッド定義</b><br />
メソッドは{}の間に定義する。以下参照。<br />
<pre class="C" name="code">- (型)メソッド名 {
// ここに実装を定義
}
</pre>
<br />
<br />
<b>可変パラメータのメソッド</b><br />
関数と同じように処理する。以下参照。<br />
<pre class="C" name="code">#import "stdarg.h"
- (void)methods: param1, ... {
va_list ap;
va_start(ap, param1);
....
}
</pre>
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-64944011209435024222012-06-24T01:48:00.000+09:002012-06-24T01:48:41.514+09:00[Objective-C][お勉強][メモ] クラス参照インタフェースが、その階層以外のクラス名を記述している場合は、<br />
<br />
そのクラスのインタフェースファイルをインクルードするか、<br />
<br />
@classディレクティブを記述する。<br />
<br />
<pre class="C" name="code">@class クラス名;
@class クラス名, クラス名;
</pre>
@classディレクティブは、インタフェースをインクルードしない。<br />
@classディレクティブは、クラス名が「クラス名」であることをコンパイラに知らせるだけ。<br />
クラスのインタフェースを実際に使うのであれば、@classではなく、インタフェースをインクルードする必要あり。<br />
<br />
.<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-11143224848923087102012-06-24T01:25:00.001+09:002012-06-24T01:25:33.397+09:00[Objective-C][お勉強][メモ] インポートインタフェースの場合、そのインタフェースに依存する全てのソースにincludeする必要がある。<br />
インタフェースファイルは通常以下のようにincludeする。<br />
<pre class="C" name="code">#import "インタフェースファイル.h"
</pre>
<br />
<b>#importと#includeの違い</b><br />
#importは2回以上includeされない。そのほかは#includeと同じ。<br />
<br />
.<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-67421789252679724142012-06-23T23:57:00.001+09:002012-06-24T01:09:55.611+09:00[Objective-C][お勉強][メモ]クラス定義クラスは以下の2つに分けて定義する。<br />
<br />
1) インタフェース<br />
2) 実装<br />
<br />
通常インタフェースと実装は別々のファイルとし、インタフェースは.h、実装は.mという拡張子をもつ。<br />
<br />
<br />
<b>インタフェース</b><br />
インタフェースはディレクティブ@interfaceで始まり、ディレクティブ @endで終わる。<br />
クラスのインタフェースは以下のように定義する。<br />
<br />
<pre class="C" name="code">@interface クラス名 : スーパクラス
{
インスタンス宣言
}
メソッド宣言
プロパティ宣言
@end
</pre>
<b><br /></b><br />
<b><br /></b><br />
<b><br /></b><br />
<b><br /></b><br />
<b>メソッド宣言</b><br />
<b>クラスメソッド</b><br />
先頭に"+"(プラス)をつける。<br />
戻り値の型はC言語の型キャストの構文を使って記述する。<br />
戻り値やパラメータの型を省略すると、デフォルトでidが使用される。<br />
パラメータはメッセージと同様に名前の後のコロンの後に記述する。<br />
<pre class="C" name="code">+ (戻り値の型)メソッド名;
+(戻り値の型)メソッド名:(パラメータの型)パラメータ;
+(戻り値の型)メソッド名:(パラメータの型)パラメータ 名前:(パラメータの型)パラメータ;
</pre>
<br />
<b>インスタンスメソッド</b><br />
先頭に"-"(マイナス)をつける。<br />
戻り値の型はC言語の型キャストの構文を使って記述する。<br />
戻り値やパラメータの型を省略すると、デフォルトでidが使用される。<br />
パラメータはメッセージと同様に名前の後のコロンの後に記述する。<br />
<pre class="C" name="code">-(戻り値の型)メソッド名;
-(戻り値の型)メソッド名:(パラメータの型)パラメータ;
-(戻り値の型)メソッド名:(パラメータの型)パラメータ 名前:(パラメータの型)パラメータ;
</pre>
<br />
<br />
<b>可変パラメータをもつメソッド</b><br />
Cと同様にカンマと省略記号を使って宣言する。<br />
<pre class="C" name="code">- (void)methoddayo:param1, ...;
</pre>
<br />
<br />
<br />
<b>プロパティ宣言</b><br />
プロパティ宣言は以下のように記述する。<br />
<pre class="C" name="code">@property (attribute) Type propertyName;
</pre>
<br />
<br />
<br />
<br />
<b>インスタンス宣言</b><br />
もともと必要だったが、今や実装ブロックやプロパティからの自動生成が可能なため、<br />
通常はここでインスタンス宣言すべきでない、とのこと。<br />
(波括弧も不要)<br />
<br />
<br />
.<br />
<div>
<br /></div>
<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-61735240859651864922012-06-23T23:18:00.000+09:002012-06-23T23:18:11.800+09:00[Objective-C][お勉強][メモ]ソース上のクラス名クラス名は以下の2つの場合にのみ使用できる。<div>
<br /></div>
<div>
1) 型名として使う場合</div>
<div>
<br /></div>
<div>
ObjA *objA;</div>
<div>
<br /></div>
<div>
等。</div>
<div>
<br /></div>
<div>
2) メッセージ式のレシーバとして使う場合</div>
<div>
この場合のクラス名はクラスオブジェクトを意味する。</div>
<div>
<br /></div>
<div>
[ObjA alloc];</div>
<div>
<br /></div>
<div>
などなど。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
また、クラス名はグローバル変数とネームスペースが同一のため、</div>
<div>
同じ名前をつけることはできない。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
.</div>atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-62526467313341896132012-06-23T23:09:00.001+09:002012-06-23T23:09:25.545+09:00[Objective-C][お勉強][メモ] ルートクラスのメソッドクラスオブジェクトはルートクラスのインスタンスメソッドを実行する権限があるらしい。<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-85861277071994007842012-06-23T00:00:00.000+09:002012-06-23T00:00:32.771+09:00[Objective-C][お勉強][メモ] クラスオブジェクトの初期化クラスが静的変数やグローバル変数を使っている場合、initializeというメソッドで初期化するのが良いんでないかい、と書いてある。<br />
<br />
<br />
ランタイムがinitializeメッセージを送るタイミングは以下のとおり。<br />
<br />
1) メッセージを受信する前<br />
2) 該当クラスのスーパークラスがinitializeメッセージを受信した後<br />
<br />
よって、クラスは使用される前にinitializeメッセージを処理する機会が与えられる。<br />
<br />
特に初期化する必要がなければ、initializeメソッドを実装する必要は無い。<br />
<br />
<br />
<b>注意点!</b><br />
initializeを実装したスーパークラスObjAを継承したinitializeを実装しないクラスObjBがある場合、ObjBに対して送られたinitializeメッセージはObjBに該当するinitializeメソッドが<br />
無いため、スーパークラスObjAのinitializeへと転送する。そのため、ObjAのinitializeメソッドが複数回実行されてしまう場合がある。<br />
<br />
複数回実行されるのを防ぐために、以下のように実装する。<br />
<pre class="C" name="code">+(void)initialize
{
if (self == [ObjA class]) {
// ここで初期化処理
}
}
</pre>
<br />
とのこと。atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-72755146631287241762012-06-22T21:28:00.003+09:002012-06-22T21:29:11.237+09:00[Objective-C][お勉強][メモ] クラス変数<b>そんなものは無い。</b><br />
<br />
<br />
<br />
グローバル変数やstatic変数で代用した例。<br />
static ObjA *objA;<br />
<br />
@implementation ObjA;<br />
+(id)getInstance<br />
{<br />
どーのこーのどーのこーの<br />
return objA;<br />
}<br />
<br />
もちろん<br />
<br />
static ObjA *objA;<br />
<br />
じゃなく、<br />
<br />
ObjA *objA;<br />
<br />
とすることも可能。<br />
だけど、なるべく有効範囲を限定した方が有効、とのこと。<br />
<br />
.<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-41972021763516653352012-06-22T03:15:00.000+09:002012-06-22T03:15:11.314+09:00[Objective-C][お勉強][メモ] インスタンス作成<b>allocメソッド</b><br />
新しいオブジェクトのインスタンス変数を動的にメモリを割り当てる。<br />
割り当てたインスタンス変数を0に初期化する。<br />
クラスオブジェクトには少なくともallocのようなメソッドが1つ以上ある。<br />
<br />
id str = [NSString alloc];<br />
<br />
みたいな。<br />
<br />
<br />
<b>initメソッド</b><br />
オブジェクトが有用であるためには、0で初期化するだけじゃなく<br />
完全に初期化する必要があり、その初期化を行う。<br />
通常allocの直後に行う。<br />
クラスオブジェクトには少なくともinitのようなメソッドが1つ以上ある。<br />
<br />
id str = [[NSString alloc] init];<br />
<br />
とか。<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-52892682265321536492012-06-22T03:02:00.001+09:002012-06-22T03:02:09.695+09:00[Objective-C][お勉強][メモ] クラスオブジェクトソースコード上では、クラスオブジェクトはクラス名として表される。<br />
ex)<br />
[NSString alloc];<br />
<br />
メッセージ式で、単なるレシーバオブジェクトとして表される。<br />
その他の場合、クラスまたはインスタンスに対してidクラスを返すよう要求することで<br />
クラスオブジェクトを得られる。<br />
ex)<br />
id classObjDaYo = [NSString class];<br />
<br />
NSString *strObj = [NSString @"aaa"];<br />
id classObj2DaYo = [strObj class];<br />
<br />
上記で、クラスオブジェクトはid型としているが、すべてのクラスオブジェクトは<br />
Class型なので、Class型とすることもできる。<br />
ex)<br />
Class classObjDaYo = [NSString class];<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-7184487713312044242012-06-22T02:31:00.001+09:002012-06-22T02:31:43.416+09:00[Objective-C][お勉強][メモ] 型のイントロスペクション実行時にインスタンスがどの型かを調べることができる。<br />
調べるためには、NSObjectのメソッドが使える。<br />
<br />
<b>isMemberOfClass:</b><br />
レシーバが、引数で指定されたクラスであるかどうか調べる。<br />
<br />
[objA isMemberOfClass:ObjA];<br />
<br />
objAはObjAクラスであるかどうか。<br />
<br />
<br />
<b>isKindOfClass:</b><br />
レシーバが、引数で指定されたクラスを継承しているか、または属しているかを調べる。<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-89735491945865014022012-06-22T01:24:00.001+09:002012-06-22T01:57:06.833+09:00[Objective-C][お勉強][メモ] 継承クラス定義は追加的に定義する。<br />
<br />
新しいクラスはすべて別のクラスをベースとする。<br />
<br />
<br />
<b>NSObjecgt</b><br />
ルートクラスは普通はNSObject。<br />
NSObjectはルートクラスなのでスーパクラスが無い。<br />
ルートクラスを定義することも可能だけど、止めといた方がいいってさ。<br />
オブジェクトとして動作させるコードが書いてあるらしい。<br />
<br />
<b>インスタンス変数</b><br />
普通に継承<br />
<br />
<b>メソッド</b><br />
普通<br />
<br />
<b>メソッドのオーバライド</b><br />
普通.<br />
<br />
<b>インスタンス変数のオーバライド</b><br />
できない。<br />
<br />
<b>抽象クラス</b><br />
継承されることが目的であったり、主に継承されることが目的のクラス。<br />
通常、単独では不完全。<br />
ただし、Objective-Cにはクラスを抽象クラスとしてマークするような構文は無い。<br />
抽象クラスであってもallocできる。<br />
<br />
<br />
<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-23624508009072405942012-06-21T23:27:00.000+09:002012-06-21T23:27:13.514+09:00[Objective-C][お勉強][メモ] クラスObjective-Cではクラスを定義することでオブジェクトを定義する。<br />
<br />
クラスの定義は一種のオブジェクトのプロトタイプ。<br />
<br />
コンパイラによってクラスに1つだけアクセス可能な「クラスオブジェクト」(ファクトリオブジェクト)が作成される。<br />
このクラスオブジェクトにより構築されるオブジェクトが、クラスのインスタンス。<br />
<br />
<br />
慣習的にクラス名は大文字で始まる。<br />
インスタンス名は小文字で始まる。<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-87630872776679108962012-06-21T23:07:00.001+09:002012-06-21T23:07:45.259+09:00[Objective-C][お勉強][メモ] ドット構文アクセサメソッドを呼び出す[]の代わりにドットを使うことができる。<br />
直接インスタンス変数を変更しているわけではなく、アクセサメソッド呼び出しの「構文糖」。<br />
<br />
[ObjA setValue:10];<br />
<br />
と書く代わりに<br />
<br />
ObjA.value = 10;<br />
<br />
と書くことができる。<br />
同様に<br />
<br />
int a = [ObjA getValue];<br />
<br />
と書く代わりに<br />
<br />
int a = ObjA.value;<br />
<br />
と書くことができる。<br />
<br />
直接ObjAのインスタンス変数valueにアクセスしているわけではなく、<br />
ObjAのアクセサメソッドを経由している。<br />
<br />
自分の保有するインスタンス変数にアクセスする場合、self.(selfドット)をつけて<br />
アクセスすれば、アクセサメソッド経由になる。もちろんself.を付けなければ<br />
直接インスタンス変数にアクセスする。<br />
<br />
[self setValue:10];<br />
<br />
は<br />
<br />
self.value = 10;<br />
<br />
と同等だけど、<br />
<br />
value = 10;<br />
<br />
とは違う。インスタンス変数に直接アクセスしている。<br />
<br />
<br />
へへ。<br />
.<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-5316882406676577492012-06-21T08:17:00.000+09:002012-06-21T08:17:28.941+09:00[Objective-C][お勉強][メモ] 動的バインディング受信側のオブジェクトと、メッセージは、メッセージが送信されるまで結合されない。<br />
<br />
なので、実際にどのメソッドが実行されるかは、実行時にだけ知ることができる。<br />
<br />
<br />
さらに、送信するメッセージ(メソッドセレクタ)も実行時に決定させることが可能。<br />
(メッセージ(メソッドセレクタ)を変数にする)<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-11536357522860308532012-06-21T08:09:00.002+09:002012-06-21T08:09:47.919+09:00[Objective-C][お勉強][メモ] ポリモーフィズム異なるオブジェクトでも同じセレクタ名を持つのであれば<br />
同じメッセージに対して、応答することができる。<br />
<br />
@implementation ObjBase;<br />
- (void)methodBase:(id)obj<br />
{<br />
[obj methodYahoo];<br />
}<br />
@implementation ObjA;<br />
- (void)methodYahoo<br />
{<br />
NSLog(@"ObjA DA YO!");<br />
}<br />
@implementation ObjB;<br />
- (void)methodYahoo<br />
{<br />
NSLog(@"ObjB DA YO!");<br />
}<br />
<br />
であれば、<br />
<br />
[[[ObjBase alloc] init] methodBase:[[ObjA alloc] init]];<br />
<br />
がいけるとすれば、<br />
<br />
[[[ObjBase alloc] init] methodBase:[[ObjB alloc] init]];<br />
<br />
もいけるって感じかどうなのか。<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-67076286061847979992012-06-21T03:12:00.004+09:002012-06-21T19:48:59.876+09:00[Objective-C][お勉強][メモ] オブジェクトメッセージングあるオブジェクトに対して何か実行させたいなら、そのオブジェクトに対してメッセージを送るんだそうだ。<br />
その書式は以下。<br />
<br />
[receiver message];<br />
<br />
これを「<b>メッセージ式</b>」というらしい。<br />
<br />
receiver は、メッセージを受信するオブジェクト。<br />
messageは、receiverが実行すべきこと。<br />
<br />
<br />
<br />
ランタイムシステムはメッセージが送信されると、receiverの持つ全てのメソッドの中から適切なメソッドを選んで呼び出す。<br />
<br />
なので、message部分はreceiverのメソッド実装を「選択」することから<br />
セレクタと呼ぶこともあるとのこと。<br />
<br />
<b>message部の書き方</b><br />
<b>AオブジェクトのBメソッドを実行する場合</b><br />
[A B];<br />
<br />
<b>Aオブジェクトの引数1つのBメソッドを実行する場合</b><br />
メソッド名の直後にコロンを置いて、その直後に引数の値を指定する。<br />
[A B:10];<br />
<br />
<b>Aオブジェクトの複数の引数を持つBメソッドを実行する場合</b><br />
2つ目以降の引数には引数名とコロン、そして引数の値を指定する。<br />
[A B:10 C:20 D:30];<br />
<br />
セレクタ名(Javaで言えばシグネチャ?)は、メソッド名とパラメータ名で成る。<br />
上記の例だと<br />
B:C:D:<br />
となるとのこと。コロンが3つあるのは引数を3つ取るため。<br />
戻り値や引数の型はセレクタ名には含まれない。<br />
<br />
<b>Aオブジェクトの可変引数を持つBメソッドを実行する場合</b><br />
コロンの後にカンマで区切って指定する。<br />
[A B:10,20,30];<br />
<br />
セレクタ名にはカンマは含まれない。<br />
なので[A B:10,20,30]のセレクタ名は<br />
B:<br />
となる。<br />
<br />
<b>値を返すメッセージ式</b><br />
メッセージ式で指定されたメソッドが値を返す場合、メッセージ式は値を返すことができる。<br />
A = [B C];<br />
<br />
BオブジェクトのCメソッドを実行した結果、その戻り値をAに代入。<br />
<br />
<b> メッセージ式の中にメッセージ式</b><br />
メッセージ式はネストできるので以下のように書くことができる。<br />
[A B:[C D]];<br />
<br />
上記は、CオブジェクトのDメソッドの戻り値をAオブジェクトのBメソッドのパラメータとしている。<br />
<br />
<br />
<b>nilへのメッセージ</b><br />
nilへメッセージ送信可能。<br />
<br />
<b>nilへのメッセージパターン</b><br />
<b>1) メソッドがオブジェクトを返す場合、nilを返す。</b><br />
<br />
ObjB *objB = nil;<br />
ObjA *objA = [ObjB methodReturnsObjA];<br />
<br />
の場合objAはnil。<br />
<br />
<br />
<b>2) メソッドが以下の型を返す場合、メソッドは0を返す。</b><br />
ポインタ型、sizeof(void*)以下のサイズの整数スカラ、float、double、long double、long long<br />
<br />
@implementation ObjA;<br />
- (float)methodReturnsFloat;<br />
<br />
の場合、<br />
<br />
ObjA *objA = nil;<br />
[objA methodReturnsFloat];<br />
<br />
は、0.0を返す。<br />
<br />
<b>3) メソッドがstructを返す場合は、そのstructのすべてのフィールドに0.0を返す。</b><br />
<br />
<b>4) 上記、1)〜3)以外の場合は、返す値は不定。</b><br />
<br />
<br />
そんだけ。<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-22572987465694907082012-06-20T19:56:00.002+09:002012-06-20T19:56:24.821+09:00[Objective-C][お勉強][メモ] 動的型定義オブジェクトは実行時に動的に型定義されるらしい。<br />
<br />
どうやって型を特定するかというと、<br />
<br />
振る舞い(メソッド)とデータ(インスタンス変数)の種類<br />
<br />
で特定するっぽい。<br />
<br />
<br />
で、これはisa変数ってのがやるみたい。<br />
<br />
.<br />
<br />
<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-28722870459979481692012-06-20T19:46:00.001+09:002012-06-21T03:14:42.168+09:00[Objective-C][お勉強][メモ] nilNULLみたいなものでnilっていうのがある。<br />
<br />
NULLオブジェクトだそうで。<br />
<br />
<br />
値が0のid。<br />
<br />
<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-43395891242494939082012-06-20T19:44:00.000+09:002012-06-20T19:44:07.698+09:00[Objective-C][お勉強][メモ] idどんなオブジェクトにも対応する汎用的な型に<div>
<br /></div>
<div>
id</div>
<div>
<br /></div>
<div>
という型がある。なんだかよく分からないけど、デフォルトのデータ型らしい。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
typedef struct objc_object {</div>
<div>
Class isa;</div>
<div>
} *id;</div>
<div>
<br /></div>
<div>
だそうで。</div>
<div>
<br /></div>
<div>
なので、idはstruct objc_objectへのポインタ。</div>
<div>
<br /></div>
<div>
isaっていうのは、このオブジェクトがどのクラスのインスタンスかを</div>
<div>
表すobjc_classへのポインタ。</div>
<div>
<br /></div>
<div>
.</div>
<div>
<br /></div>atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-55526675414156806412012-06-20T19:31:00.000+09:002012-06-20T19:31:33.561+09:00[Objective-C][お勉強][メモ] メモリ管理Objective-Cがサポートしているメモリ管理の仕組みは<br />
<br />
1) 自動参照カウント(ARC:Automatic Reference Counting)<br />
2) 非自動参照カウント(MRC:Manual Reference Counting/MRR:Manual Retain/Releae)<br />
3) ガべージコレクション<br />
<br />
の3つ。3)はiOSでは非対応。<br />
<br />
<br />
1) 自動参照カウント(ARC)<br />
コンパイラが勝手にオブジェクトの存続期間を推論しちゃって決定する。<br />
<br />
2) 非自動参照カウント(MRC)<br />
オブジェクトの存続期間は人間(ディベロッパ)が管理する。<br />
<br />
3) ガベージコレクション<br />
自動コレクタというのが勝手にオブジェクトの存続期間を管理する。<br />
<br />
<br />
らしいよ。<br />
.atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-15043887687816028912012-06-09T17:42:00.002+09:002012-06-09T17:42:37.541+09:00[iphone][xcode] コマンドラインでbuildするまぁ、manのとおり。<br />
<br />
Xcodeプロジェクトのbuildするためには、.xcodeprojファイルのあるディレクトリにいってxcodebuildを実行すればいいらしい。<br />
<br />
<br />
<br />
xcodebuild [-project projectname] [-target targetname ...] [-configuration<br />
configurationname] [-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=val<br />
ue ...]<br />
<br />
って書いてあるんだけど、target、configuration、sdkってなんだろね。<br />
targetとconfigurationはxcodebuild -listで分かるみたい。<br />
<br />
$ xcodebuild -list<br />
<br />
<br />
Information about project "exp1":<br />
Targets:<br />
exp1<br />
exp1Tests<br />
<br />
Build Configurations:<br />
Debug<br />
Release<br />
<br />
If no build configuration is specified and -scheme is not passed then "Release" is used.<br />
<br />
Schemes:<br />
exp1<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
sdkはxcodebuild -showsdksってやれば良さそうだね。</div>
<div>
<br /></div>
<div>
$ xcodebuild -showsdks</div>
<div>
Mac OS X SDKs:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Mac OS X 10.6 <span class="Apple-tab-span" style="white-space: pre;"> </span>-sdk macosx10.6</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Mac OS X 10.7 <span class="Apple-tab-span" style="white-space: pre;"> </span>-sdk macosx10.7</div>
<div>
<br /></div>
<div>
iOS SDKs:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>iOS 5.1 <span class="Apple-tab-span" style="white-space: pre;"> </span>-sdk iphoneos5.1</div>
<div>
<br /></div>
<div>
iOS Simulator SDKs:</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Simulator - iOS 5.1 <span class="Apple-tab-span" style="white-space: pre;"> </span>-sdk iphonesimulator5.1</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
ほらね。</div>
<div>
<br /></div>
<div>
ということで、以下でbuildできるはず。</div>
<div>
<br /></div>
<div>
$ xcodebuild -target exp1 -configuration Debug -sdk iphoneos5.1 clean build</div>
<div>
<br /></div>
<div>
と思ったら、以下のエラー。。</div>
<div>
<br /></div>
<div>
<div>
User interaction is not allowed.</div>
<div>
Command /usr/bin/codesign failed with exit code 1</div>
</div>
<div>
<br /></div>
<div>
調べたら、keychainをunlockしなきゃいけないみたい。</div>
<div>
ということで</div>
<div>
<br /></div>
<div>
$ security unlock-keychain /Users/konno/Library/Keychains/login.keychain</div>
<div>
<br /></div>
<div>
で、xcodebuildリラン。</div>
<div>
<br /></div>
<div>
<div>
$ xcodebuild -target exp1 -configuration Debug -sdk iphoneos5.1 clean build</div>
</div>
<div>
<br /></div>
<div>
** BUILD SUCCEEDED **</div>
<div>
<br /></div>
<div>
って出たのでOKっぽい。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
あとはパッケージングと実機への転送かな。</div>
<div>
.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0tag:blogger.com,1999:blog-1195584593823240536.post-46114417957098111272012-06-08T23:23:00.002+09:002012-06-08T23:24:49.371+09:00[iphone] 入門するよ<b>リファレンス</b><br />
<b><br /></b><br />
<b>iOS Developer Library</b><br />
<a href="https://developer.apple.com/library/ios/navigation/">https://developer.apple.com/library/ios/navigation/</a><br />
<br />
<br />
<b>日本語</b><br />
<a href="https://developer.apple.com/jp/devcenter/ios/library/japanese.html">https://developer.apple.com/jp/devcenter/ios/library/japanese.html</a><br />
<br />
<br />atkonnhttp://www.blogger.com/profile/07913370613168816259noreply@blogger.com0