<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
	<title>prog*sig</title>
	<link>http://efcl.info/adiary/</link>
	<language>ja</language>
	<description>プログラミングのメモ -　突っ込みがあったらどんどんお願いします。</description>
	<copyright>Copyright 2012</copyright>
	<pubDate>Sat, 15 Oct 2011 13:44:47 GMT</pubDate>
	<lastBuildDate>Sat, 04 Feb 2012 05:52:17 GMT</lastBuildDate>
	<generator>http://adiary.abk.nu/#2.21</generator>
	<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
	<item>
		<title>CHAPTER13 オブジェクトのコピーと保存 </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#tm1318686287</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13</guid>
		<category>Objective-C</category>
		<pubDate>Sat, 15 Oct 2011 13:44:47 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p1"><span>■</span></a>浅いコピーと深いコピー</h3>
オブジェクトのポインタをコピーするshallow copyと、新たなメモリ領域を持つポインタを作る深いコピーdeep copyがある。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p1.1"><span></span>ゾーンについて</a></h4>
copyWithZoneメソッドというようにゾーンは今も名残が残っている。<br>
動的なメモリ確保のヒープ領域はアドレス空間では幅広く使われたりしますが、空間的な局所参照性や仮想空間などアクセスが集中する系のデータの場合はある程度近い場所に配置したほうが効率が良くなります。<br>
このヒープ領域をある程度区切って、関係の深いデータやオブジェクトはその区間=ゾーンを利用できるようにしていました。<br>
現在はデフォルトゾーンでも十分効率化されているため殆ど明示的に使うことはなくなりました。＾<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p1.2"><span></span>コピーメソッドの定義</a></h4>
Objective-CのNSObjectにはcopyメソッドがあり、新しいインスタンスを作成できます。<br>
しかし、copyメソッドの実体はcopyWithZoneというインスタンスメソッドで、デフォルトゾーンに新たにインスタンスを作成します。<br>
copyWithZoneはNSCopyingプロトコルで実装されてる。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p2"><span>■</span></a>オブジェクトのアーカイブ化</h3>
属性値や相互関係も含めてオブジェクトをバイト列に変換されたものをアーカイブという。<br>
複合手段はアンアーカイブといい、これはNSCoderのサブクラスで定義されている。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p3"><span>■</span></a>プロパティリスト</h3>
ASCII、XML,バイナリの3形式がある。<br>
プロパティリスト全体をNSDictionaryのインタンスに格納した時、これをルート辞書とよび、この辞書のキーは文字列でないと行けない。<br>
ASCIIはOPENSTEPからの互換性のために存在し、このplistデータからオブジェクト構造を複合するには<br>
propertyListメソッドを使用します。<br>
バイナリデータと(配列)、辞書を合わせた形。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER13#k137p3.1"><span></span>XML形式のプロパティリスト</a></h4>
writeToFile/ContentsOfFileで読み書きができる。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER13#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER13#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER12 宣言プロパティとアクセサ </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#tm1318249750</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12</guid>
		<category>Objective-C</category>
		<pubDate>Mon, 10 Oct 2011 12:29:10 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
プロパティは概念的に<br>
<ul>
	<li>宣言プロパティ</li>
	<li>アクセッサによるプロパティ</li>
	<li>key valueコーディングにおけるプロパティ</li>
</ul>
の3つがあり、上ほど狭い概念という感じ。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p0.1"><span></span>プロパティに関するイントロスペクション</a></h4>
クラスにどんな宣言プロパティが備わっているか、そのシグネチャについて動的に調べることができる。<br>
あるクラスが持っているメソッドやプロパティの型や名前といったメタ情報へアクセスする機能の事をイントロスペクションorリフレクションという。<br>
Objective-CではresponsedToSelector:メソッドなどもイントロスペクションに該当する。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p0.2"><span></span>プロパティの実装</a></h4>
@propertyで宣言したものは@synchronizeでアクセサを実装できる。<br>
@synchronizeの位置は@implementationから@endまでの間ならどこでもいい。<br>
@synchronizeを使わないで手動でアクセサを書く場合は@dynamicというコンパイラディレクティブを使う。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p0.3"><span></span>@synchronizeとインスタンス変数</a></h4>
@synthesize item; としたときにitemのインスタンス変数が無い場合、"脆弱ではないインスタンス変数"を持つモダンランタイムは自動的にインスタンス変数を@propertyで宣言された型で作成するようになっている。できるだけインスタンス変数はちゃんと作るようにしておく。<br>
<br>
@propertyと@synchronizeどちらもカンマ区切りで複数の宣言、実装を一行で書ける。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p0.4"><span></span>プロパティの属性指定</a></h4>
プロパティのgetter,setterは次のようにメソッド名の指定などもできる。<br>
<pre>
@property(setter=setValue:) int hitPoint;
</pre>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p0.5"><span></span>アトミック性</a></h4>
nonatomicというのはatomicではないという意味で。アトミックとは並列プログラミングの概念。<br>
nonatomicはそれぞれのgetter,setterが複数のスレッドで同時に実行されるかもしれないメソッド定義のことで、atomicはその逆。つまりnonatomicではない場合、lock,unlockに囲まれたような動作になる。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p1"><span>■</span></a>ドット演算子</h3>
Objective-C2.0ではプロパティへのアクセスにドット演算子を使えて、コンパイル時にアクセサの呼び出してとして解釈される。クラスを型として設定した変数に限定されるので、id型の変数にはドット演算子を使えない。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER12#k136p1.1"><span></span>構造体のメンバ参照との混用</a></h4>
プロパティを参照するためのドット演算子と構造体へのメンバ参照のドット演算子は混用しがち。<br>
例えばNSSize型は構造体なので、<br>
<pre>
w = win.minSize.widht;
// 以下と同じ
w = [win minSize].width;
// 構造体のメンバ参照であるので、次のように代入はできない
win.minSize.width = 320.0;
// 意図することを書くには次のようにする
NSSize sz = win.minSize;
sz.width = 320.0;
win.minSize = sz;// sizeをまるごと変えることはできる
</pre>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER12#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER12#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER11 プロトコル </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#tm1318171299</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11</guid>
		<category>Objective-C</category>
		<pubDate>Sun, 09 Oct 2011 14:41:06 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#k135p1"><span>■</span></a>プロトコル</h3>
継承を用いた場合、スーパークラスの実装がサブクラスに影響するが<br>
プロトコルの場合は宣言だけの集合のため実装は各プロトコルが適応されたクラスによる。<br>
<br>
プロトコルは複数のプロトコルを適応することができる。<br>
<pre>
@interface A: NSObjct &lt;S, T&gt;
//
@end
</pre>
だが、この時、プロトコル間で返り値が異なるような同じ名前のメソッドが重複していている場合は適応することができない。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#k135p1.1"><span></span>プロトコルを指定した型宣言</a></h4>
id &lt;S&gt; obj;<br>
のように変数がプロトコルに適合するかという宣言もできる。<br>
この場合、コンパイル時に静的なチェックが出来るようになる。<br>
プロトコルに適合しているかは、実装ではなくてインターフェース部でプロトコルを採用してるかを宣言子ておかないといけない。<br>
<pre>
-(void)setA:(NSView &lt;Clickable&gt; *)aView;
</pre>
という宣言は、仮引数がNSView型のインスタンスというだけではなくて、カテゴリor継承でプロトコルClickableに適合したオブジェクトでないとエラーになる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#k135p1.2"><span></span>プロトコルへの適合チェック</a></h4>
プロトコルへの適合を動的に調べるには@protocol()ディレクトリを使用して、指定したプロトコルを表現するデータへのポインタを得て、conformsToProtocolメソッドを利用して判定できる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#k135p1.3"><span></span>必須機能</a></h4>
プロトコルのメソッドは@options,@requiredで必須かオプションなのかを指定することができる。(Objective-C2.0かららしいですよ)<br>
<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER11#k135p2"><span>■</span></a>非形式プロトコル</h3>
プロトコルという名前だけど実態はNSObjectへのカテゴリのこと<br>
<ul>
	<li> <a href="http://nauplius.tk/index.php?cmd=read&amp;page=Cocoa%2F%E9%9D%9E%E5%BD%A2%E5%BC%8F%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB">Cocoa/非形式プロトコル-PGWiki</a></li>
</ul>
メソッド群で全てが必須ではない場合に非形式プロトコルが使われていたが、現在は@optionsなどが指定できるようになったので今はプロトコルを使ったものが多い。<br>
非形式プロトコルの特徴としては<br>
<ul>
	<li>NSObjctクラスのカテゴリとして宣言</li>
	<li>宣言されたメソッドの実装は必須でない</li>
	<li>コンパイル時に非形式プロトコルへの適合をチェックする方法はない</li>
	<li>実行時も同じく適合チェックできない。ここのメソッドを実装しているかは確認できない</li>
</ul>
という感じらしい。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER11#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER11#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER10 抽象クラスとクラスクラスタ </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER10#tm1318094574</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER10</guid>
		<category>Objective-C</category>
		<pubDate>Sat, 08 Oct 2011 17:22:54 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER10#k134p1"><span>■</span></a>抽象クラス</h3>
抽象クラスはサブクラスを定義することを前提としてメソッドの宣言のみをおこなっている不完全な形のクラスの事を抽象クラス、仮想クラスという。<br>
Objective-Cでは抽象クラスのための仕組みはないので、あくまで概念。<br>
allocすればインスタンスを作れてしまう。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER10#k134p1.1"><span></span>クラスクラスタ</a></h4>
クラスクラスタは同じインターフェースと同じ機能を提供するクラスの集合体の事。<br>
多くの場合抽象クラスとして実装されていて、インスタンスは抽象クラスのサブクラスが使われていたりするが、余り意識しなくても使える。<br>
NSStringとかNSArrayとかもクラスクラスタなもの<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER10#k134p1.2"><span></span>クラスクラスタのサブクラスを作るには</a></h4>
クラスクラスタを拡張したり変更したクラスを作るにはどうするか?<br>
<h5>カテゴリで対応する</h5>
カテゴリでクラスクラスタに機能を付けることができる。<br>
<h5>プリミティブメソッドを最定義する。</h5>
クラスクラスタ内のクラス実装はここのクラスごとに異なる部分と、クラスタで共通の部分ある。<br>
ここのクラスごとに異なる部分へアクセスを担当するメソッドをプリミティブメソッドと呼ぶ。<br>
つまり、クラスクラスタの新しいサブクラスを作成するには、プライベートなデータ構造と、それにアクセスするプリミティブメソッドを定義すれば良いことになる。<br>
<br>
クラスタのサブクラスを作成する手順<br>
<ol>
	<li>プライベートなデータ構造を決める</li>
	<li>イニシャライザを定義する</li>
	<li>コンビニエンスコンストラクタを定義する</li>
	<li>プリミティブメソッドを定義する</li>
	<li>その他のメソッド定義する</li>
</ol>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER10#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER10#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER09 カテゴリ</title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#tm1316781274</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09</guid>
		<category>Objective-C</category>
		<pubDate>Fri, 23 Sep 2011 12:03:36 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p0.1"><span></span>サブモジュールとしてのカテゴリ</a></h4>
カテゴリをサブモジュールとして、関係が深いものや用途が似ているものをグループにすることができる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p0.2"><span></span>メソッドの前方宣言</a></h4>
インターフェースにメソッドが宣言されていなくても、C言語のように前方の局所メソッドは参照することができますが、これをカテゴリを使って解決することもできる。<br>
<br>
このままだとmethodAからmethodBを呼ぶことができない。<br>
<pre>
- (int)methodA{
    [self methodB:0];
}
- (void)methodB:(int)arg{
    [self methodA];
}
</pre>
これを局所的カテゴリを使って解決することもできる。<br>
<pre>
- (int)methodA{
    [self methodB:0];
}
- (void)methodB:(int)arg{
    [self methodA];
}

// 局所的カテゴリの宣言 

@interface クラス名(Local)
- (int)methodA;
- (void)methodB:(int)arg;
@end

@implementation クラス名(Local)
- (int)methodA{
    [self methodB:0];
}
- (void)methodB:(int)arg{
    [self methodA];
}
@end
</pre>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p0.3"><span></span>プライベートなメソッド</a></h4>
クラスの外部には公開しないクラスにメソッドをまとめておいて、それをカテゴリとして利用できるようにすればプライベートなメソッドとして定義できる。<br>
しかし、このカテゴリで定義したメソッドはサブカテゴリからメソッドを上書きできてしまうため、固有の接頭辞をつけたプライベートメソッドにすることが推奨されている。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p0.4"><span></span>クラスエクステンション</a></h4>
クラスをカテゴリに分けて宣言、実装を行った場合クラス本体とそれぞれをカテゴリは独立してコンパイルされるため、他にどんなカテゴリが付随しているのかは認識しない。つまりリンカでチェックされるわけではない。<br>
カテゴリを別ファイルにして読みこむようにしてプライベートなメソッドを定義するという形の場合、<br>
カテゴリのファイルの定義を実装し忘れてる心配があります(呼び出されるときには落ちるが、コンパイルできる)。<br>
こういう時にクラスエクステンションといく特殊なカテゴリを使うと、実装漏れを防ぐ事ができる。<br>
<pre>
// クラスエクステンションは 無名カテゴリとも言われたり
@interface Card( )
- (void)methodA;
@end
</pre>
このように非公開クラスファイルでカテゴリ宣言をすれば、実装しないとコンパイル時にエラーになります。(クラスエクステンション自体でプライベートにする機能があるわけじゃないので、非公開のクラスにクラスエクステンションを使った宣言を作る).<br>
<ul>
	<li> <a href="http://d.hatena.ne.jp/murakaming/20110831/1314799056">クラスエクステンション機能 - ASとか</a></li>
	<li> <a href="http://ishwt.net/blog/2010/05/21/objc20-property/">Objective-C 2.0 のプロパティ隠蔽 | ishwt::tracking</a></li>
</ul>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p1"><span>■</span></a>既存クラスへのカテゴリ追加</h3>
NSObjectなどの既存クラスへもカテゴリを使って、新しいメソッドをつけたりする事できる。<br>
これはサブクラスに対してもメソッドが有効になるのでとても便利だが、乱用すると危険。<br>
JavaScriptのネイティブオブジェクトのprototype拡張みたいなものだと思うので、ライブラリがやるのはやばそう。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p1.1"><span></span>既存メソッドの上書き</a></h4>
カテゴリを使えば、既存クラスのメソッドも上書きする事ができる。<br>
だが、このクラスのサブクラスからsuperでメソッドを送ると、カテゴリの場合は完全に上書きしてるのでsuperとやっても再帰呼び出しが発生するだけになる。<br>
またトラブルの元にもなるので、基本的にはやるべきではない。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p2"><span>■</span></a>連想参照</h3>
Appleのドキュメントだと関連参照<br>
あるオブジェクトにたいして、別のオブジェクトへの参照を追加できる機能。<br>
普通のクラス定義は、インターフェース部にインスタンス変数を宣言する事で、そのクラスのインスタンスはその変数を持つようになる。<br>
これに対して連想参照は、実行中に必要に応じて「オブジェクトへの参照を追加」できるので、システム関数を呼び出してくっつけるような感じになる。<br>
これによって、同じクラスのインスタンスでも、参照できるオブエジェクトなどを変更できる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER09#k133p2.1"><span></span>オブジェクトの関連付けと参照</a></h4>
別のオブジェクトを参照できる世にする関連付けを行う関数は<br>
<pre>
void objc_setAssociatedObject
id objc_getAssociatedObject
void objc_removeAssociatedObject
</pre>
というのを使う。<br>
removeはまとめて削除するため、setでnilをつけて個別に関連付けを外すこともできる。<br>
<br>
例えば、配列から任意の要素を毎回ランダムで取り出すメソッドをカテゴリで定義したいとすると、NSArrayにそれをつけた場合に、前回とった要素を覚えておく必要があります。<br>
その時に、これを連想参照とカテゴリを使って実現できる。<br>
カテゴリなので、NSArrayのサブクラスからも利用できる。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER09#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER09#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER08 Foundationフレームワークの重要なクラス</title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#tm1315990220</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation</guid>
		<category>Objective-C</category>
		<pubDate>Wed, 14 Sep 2011 08:44:46 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p0.1"><span></span>immutableなオブジェクトとmutableなオブジェクト</a></h4>
可変なオブジェクト、不変なオブジェクトが存在するのは、<br>
不変なオブジェクトはデータ構造が簡潔であり処理も軽くなります。<br>
可変なオブジェクトはある程度拡張を考えていくため、データ構造が複雑になったりします。<br>
不変なオブジェクトに対してデータを追加するというのはオブジェクトをまるごとコピーすることが必要となるため、大きな不変なオブジェクトに対しては処理も大きくなってしまいます。<br>
可変なオブジェクトの場合は自動的に拡張できるため追加していくような処理に向いています。<br>
このように2つの性質を持ったオブジェクトを処理内容によって使い分けしていきます。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p0.2"><span></span>可変なオブジェクトの作成</a></h4>
NSMutableXXX は可変なクラスとなっていて、これらの可変なクラスは不変なクラスのサブクラスとして実装されている。<br>
不変なクラスのオブジェクトをまるごとコピーして可変なオブジェクトに変更することもできる<br>
不変なクラスのインスタンス -&gt; 可変なクラスのインスタンス<br>
<pre>
-(id) mutableCopy
</pre>
というインスタンスメソッドを使用する事で可変なインスタンスを返す。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1"><span>■</span></a> 文字列クラス</h3>
&gt; @""<br>
というように文字列定数(文字列オブジェクトのオブジェクト定数)を書くと、<br>
nilではなくて長さが0の文字列を表現できる。<br>
文字列定数はプログラム開始から終了まで存在し続けてreleaseやガーベッジコレクションで解放されることはない。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.1"><span></span> NSString</a></h4>
(3)書式に従った文字列作成<br>
NSStringではprintfのようなフォーマットで文字列を作成できる。<br>
このうちの%@というのは対象のオブジェクトのdescriptionメソッドを呼び出した結果を埋め込んでいる。<br>
descriptionはNSObjectで定義されているため、任意のオブジェクトを対象にできるが何を返すかはラクスの実装次第になる。<br>
<br>
(10)パスの操作<br>
文字列がファイル名のパス名を表現しているときに便利に使えるメソッドも用意されている。<br>
NSPathUtilities.hに定義されていて、パスの分解して、ファイル名や拡張子を取り出したり絶対パス7日を判定したりできるメソッドがある。<br>
<ul>
	<li> <a href="http://blog.livedoor.jp/second_flush/archives/51143820.html">Second Flush:NSString（インスタンスメソッド L〜R）</a></li>
</ul>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.2"><span></span> NSData</a></h4>
バイト列からなるデータを扱う標準のクラス。<br>
任意のバイト列をオブジェクトとして扱うラッパクラス。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.3"><span></span> NSArray</a></h4>
配列クラス<br>
(7)ファイル入出力<br>
ファイルの入出力はプロパティリストの形式で行われる。<br>
writeToFileなどファイルに出力出来る。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.4"><span></span>配列オブジェクトとオーナーシップ</a></h4>
配列にはオブジェクトも入れることができるため、次のように書く複数のオーナーシップを持ってしまい解放することが困難になります。<br>
<pre>
NSArray *arr =[[NSArray alloc] initWithObjects:
	[[Card alloc] init], [[Player alloc] init], nil];
</pre>
このコードを実行したオブエジェクトはCard,Playerのインスタンスのオーナーになり、配列arrについてのオーナーにもなります。<br>
arrも要素のオーナーを持つことになるので、arrが解放されるときarrの中のオブジェクトそれぞれに対してreleaseが呼ばれます。そのため、arrを解放しても、arrが持っていたオーナーシップは放棄できますが、オブジェクトが持っている2つの要素のオーナーシップは残ったままになってしまう。<br>
<br>
なので、autoreleaseして要素に指定するか、一旦変数に保持してから要素に指定する必要があります。<br>
<pre>
NSArray *arr =[[NSArray alloc] initWithObjects:
	[[[Card alloc] init] autorelease], [[[Player alloc] init] autorelease], nil];

// or

id card = [[Card alloc] init]; 
id player = [[Player alloc] init]; 
NSArray *arr =[[NSArray alloc] initWithObjects: card, plyaer, nil];
[card release];
[player release];
</pre>
このようなオブジェクトを格納するためのクラスはコレクションといったりして、配列の他に集合オブジェクト、辞書オブジェクトがある。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.5"><span></span>高速列挙</a></h4>
配列や集合、辞書で格納する要素のオブジェクトを順番に取り出すためにfor...in構文による高速列挙というものがある。<br>
for...in中では内容の変更はしてはいけなくて、辞書オブジェクトの高速列挙の取り出し順は内部実現に依存する。<br>
<h5> 列挙子 NSEnumerator</h5>
列挙子を使うことでもfor...inと同じように、列挙ループを行うことができる。<br>
<h5> 高速列挙と列挙子</h5>
高速列挙と呼ばれる所以は列挙子のように毎回メソッドを呼ばなくても列挙ができるため、for...inの方が高速であるからそういう。<br>
列挙子はいらない子なのかというと、それは別の話で列挙子は列挙方法も指定できるため、次のように要素を逆順に取り出すなども行える。<br>
<pre>
enumerator = [myarray reverseObjectEnumerator];
for(obj in enumerator){
// fooo
}
</pre>
また条件によって要素を読み飛ばしたり柔軟な判断もできる。<br>
高速列挙はNSFasEnumerationプロトコルを実装しているクラスで使用できるようになっている。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.6"><span></span>集合クラス</a></h4>
NSSet<br>
配列とは異なり、要素間での順番がなく、同じ要素が複数含まれないようなコレクションを集合オブジェクトと呼ぶ。cocoaではNSSetクラスで定義されている。<br>
NSMutableSetのサブクラスとしてNSCountedSetという可変集合のクラスがあり、これは同じオブジェクトを複数回含むことができ、このクラスをカウント付き集合、バッグ(bag)と呼ぶ<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p1.7"><span></span>辞書クラス</a></h4>
key valueなデータ構造を持ったNSDictionaryクラス。<br>
NSDictionaryはクラスクラスタとして提供されているため、通常の方法だとサブクラスが作成できないことに注意しておく。<br>
<br>
オブジェクト型ではないものを値に指定する場合はNSNumberやNSNull,NSValueなどのラッパクラスをできるだけ使う。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p2"><span>■</span></a>数値に対するラッパクラス</h3>
メソッドの引数にオブジェクト型を要求されることは多くの場面であるので、そういう時にラッパクラスが便利に使える。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p2.1"><span></span> NSNumber</a></h4>
NSNumberはそれぞれの方に対して生成メソッドなどがある<br>
<pre>
- initWith~
- initWithBool;
+ numberWith~
+ numberWithInt;
</pre>
NSNumber型から値を参照するにはintegerValueインスタンスメソッドを使って取り出せる。<br>
<br>
NSValueも大体同じ。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p2.2"><span></span>NSNull</a></h4>
配列などに要素としてnilを含めることはできない(末端を表してるから)<br>
なので、NSNullを使い空のオブジェクトを表現する。<br>
<pre>
+ (NSNull *) null;
</pre>
NSNullのインスタンスを返しますが、この返されるオブジェクトは常に同一のオブジェクトになる。<br>
そのため obj == [NSNull null] でNSNullなのかを判定できる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#k132p2.3"><span></span>NSURL</a></h4>
URLやパスを扱うクラス。<br>
ファイルのパスをNSURLで指定するメソッドも多い。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER08_Foundation#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER07 NSObject クラスとランタイムシステム </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#tm1315750932</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject</guid>
		<category>Objective-C</category>
		<pubDate>Sun, 11 Sep 2011 14:18:36 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p0.1"><span></span>クラスとインスタンス</a></h4>
NSObjectはisaというクラス型の変数を一つだけ持っている。<br>
isaは自分の属しているクラスオブエジェクトを参照しています。<br>
このisaは直接変更や調べることはしないで。インスタンスメソッドのclassを使ったりする。<br>
<pre>
[Class class];
</pre>
レシーバーの属するクラスを返すインスタンスメソッド。<br>
同じようにクラスイメソッドもある。<br>
レシーバー自身を返すメソッドもselfというのがある。(何もしないメソッドみたいな感じ)<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p1"><span>■</span></a>メッセージ送信の仕組み</h3>
セレクタ(メソッド名)はコンパイル時に内部表現に変換されます。<br>
この内部表現に対応するデータ型をSEL型と呼ぶ。<br>
プログラム上からセレクタ内部表現を扱うために、@selectorというコンパイラ指示子を使ってお子なる。<br>
<br>
SEL型を使ってメッセージの送信をすることもできて、performSelctorメソッドを使う。<br>
<pre>
SEL = method = (hanteishiki) ? @selector(activate:) : @selector(hide:);
id obj = (hanteishiki) ? a : b;
[target performSelctor:method withObject:obj];
</pre>
というように、呼ぶ出されるメソッドを実行時に決定できる。<br>
<br>
存在しないセレクタを指定してもエラーにならないから、-Wundeclared-selectorというオブションをつけてコンパイルするとチェックが出来る。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p1.1"><span></span>メッセージ探索</a></h4>
何度も同じメッセージを送るとき、<br>
ランタイムシステムはあるクラスのあるセレクタに対応するメソッド持っていて、その定義場所はどこかをキャッシュしています。<br>
<br>
オブジェクトのもつメソッドに対応する関数へのポインタはIMP型で表現される。これを使って直接間接を呼ぶことができる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p1.2"><span></span>selfへの代入</a></h4>
initでselfに対して代入する形でやってるのは、self以外を返す可能性があるから。<br>
<pre>
// 引数なしのイニシャライザの実装
- (id)init {
    self = [super init];
    if (self != nil) {
    // 初期化
	}
    return self;
}

</pre>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p1.3"><span></span>クラスオブジェクトとルートクラス</a></h4>
クラスオブジェクトのクラスに相当するメタクラスという概念がある。<br>
任意のクラスオブジェクトがルートオブジェクトを継承したメタクラスのインスタンスであるとみなせて、<br>
このことよりクラスオブジェクトはルートオブジェクトのインスタンスメソッドを実行できると言うことを意味している。<br>
NSObjectのインスタンスメソッドとして定義されている、performSelctorなどを利用できるなど。<br>
<br>
ターゲットアクションパラダイムという概念で、オブジェクト志向っぽい話。<br>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p2"><span>■</span></a>新しいランタイムシステム</h3>
64bitのランタイムとiOSのランタイムをモダンランタイム<br>
32bitのランタイムをレガシーランタイムと呼んでいる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#k131p2.1"><span></span>64ビットモデルと整数型</a></h4>
Cocoa環境ではNSInteger型を導入して、32bit環境ではint型、64bit環境ではlong型であるように定義している。<br>
printfなどの型の違いで指定が変わるものは、キャストするなどそういうbit別のマクロ書いて対応してるみたい(apple的に)<br>
<br>
CoreGraphocsではfloat型とdouble型がありましたが、CGFloatがたを導入して意識しなくてもいいようにしたみたい。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER07_NSObject#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER05 リファレンスカウンタを用いたメモリ管理方式 </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#tm1315143886</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05</guid>
		<category>Objective-C</category>
		<pubDate>Sun, 04 Sep 2011 13:41:07 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h3><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1"><span>■</span></a>CHAPTER05 リファレンスカウンタを用いたメモリ管理方式 </h3>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.1"><span></span>リファレンスカウンタ</a></h4>
Objective-Cでは参照カウンタを使ったメモリ管理をする。<br>
インスタンスにretainを送ってインスタンスを保持したりする。<br>
retainを送ることによってインスタンスを保持している状態を、インスタンスに対する「オーナーシップを持っている」という。<br>
ただし、このオーナーという概念はObjective-C仕様には存在しない。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.2"><span></span>インスタンスの開放のためのメソッド定義</a></h4>
オーナーシップを放棄するためにはオブジェクトに対してrelaseを送りますが、、基本的にはdeallocメソッドをオーバーライドしてreleaseをします。<br>
あるクラスのインスタンスを解放する = そのインスタンスが保持していたオブジェクトのオーナーシップを放棄する<br>
ということになる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.3"><span></span>自動開放の仕組み</a></h4>
CocoaのObjective-CにはNSAutoreleasePoolというクラスを使った自動開放の仕組みがある。<br>
<pre>
//プール作成
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//たくさんのオブジェクトを登録

//プール破棄時に、登録したオブジェクトにreleaseが送信される
[pool release];
</pre>
pool releaseで、登録したオブジェクトに対してひとつづつreleaseが実行される感じ。<br>
使い道として、ループ処理の前後に挟んでやるとか(ただ、breakなどするとあぼん)<br>
もう一つはGUIを使ったアプリで、マウスキーボードを監視して対応したメソッドを呼ぶ感じの実行ループの時に使うなど。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.4"><span></span>オーナーシップポリシー</a></h4>
オーナーシップポリシーとは「インスタンスオブジェクトのオーナーが、そのインスタンスの開放に関して正規人を持つ」ということににする取り決め。<br>
<br>
オブジェクトが別のオブジェクトのオーナーになるとはどういう場面？<br>
<h5>allocによるインスタンス生成</h5>
クラスに対してallocする、newなどでインスタンスを生成した場合、メッセージを送ったオブジェクトが新しく生成されたインスタンスのオーナーになります。<br>
<h5>copyによるインスタンスのコピー</h5>
copy系のメソッドで、インスタンの複製を生成した場合、メッセージを送ったオブジェクトが、新しく複製されたインスタンスのオーナーとなる<br>
<h5>retainによる保持</h5>
あるインスタンスにretainメッセージを送って保持した場合。<br>
メッセージを送ったオブジェクトが、レシーバであるインスタンスのオーナーとなる。<br>
つまり、一つのインスタンスに対して、複数のオブジェクトがオーナーとなることができる。<br>
= インスタンスの共有<br>
インスタンスのオーナーがreleaseやautoreleaseをするのは当然だが、逆にそれ以外のオブジェクトがreleaseすることは原則禁止。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.5"><span></span>メッセージの送受信とオーナーシップ</a></h4>
メッセージの引数にオブジェクトを送る、返り値がオブジェクトの場合について。<br>
基本的にはオーナーシップの移動は起きないものとする。<br>
渡した先でretainによる保持を行う事は自由に行える。<br>
逆にインスタンスを渡す側がそのインスタンスを使わないからautoreleaseしてオーナーシップを放棄してから渡すという事がある。<br>
この２つが同時に起こるとオーナーシップが移譲されたように見えてしまうのが混乱の元。<br>
<pre>
- (id)temValue{
	id tmp = [[ComplexData alloc] init] initWithData:myValue];
	return tmp;
}
</pre>
このようなメソッドの場合、メソッドの実行が終了した時点で、生成されたインスタンスにはオーナーがあに。メソッドの呼び出し側がretainしたとき呼び出し側がオーナーとなるが、何もしなければ自然消滅する。<br>
<br>
一時的なインスタンスを生成するクラスメソッドをObjective-Cではコンビニエンスコンストラクタという。<br>
allocとinit、autoreleaseを呼び出してインスタンスを返すようなクラスメソッドの事。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER05#k130p1.6"><span></span> 開放しないオブジェクト</a></h4>
NSString文字列のようなオブジェクト定数の事。<br>
これらのオブジェクトにretainCOuntのメッセージを送るとUINT_MAXという値が帰ってくる。<br>
開放したくないオブジェクトを定義するには、クラス定義でretain,release、retainCountを書き換える必要があり、これらのメソッドのsuperも呼び出さないようにする。<br>
そして、retainCountが常にUINT_MAXを返すようにする。<br>
これを使うのはシングルトンぐらいで、シングルトンはsharedから始まるクラスメソッドを持っていて共有される唯一のインスタンスを返すように実装されるためである。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER05#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER05#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER03 継承とクラス CHAPTER04 オブジェクトの型と動的結合 </title>
		<link>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#tm1314164732</link>
		<guid>http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04</guid>
		<category>Objective-C</category>
		<pubDate>Wed, 24 Aug 2011 05:44:47 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.1"><span></span>クラスの継承とself</a></h4>
selfはメッセージを処理しているインスタンス自身を示しているため、継承したメソッドを呼んでるつもりでもインスタンス自体にあるメソッドが呼ばれる。<br>
つまりselfは動的に変わる。<br>
<br>
superの場合は継承したクラスのメソッドを示すことがコンパイル時の依存関係から決定するため、静的に呼び出すメソッドは決まる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.2"><span></span> 局所的メソッド</a></h4>
インターフェース部で宣言してなくても、メソッドを実装すればそのクラス内の局所的メソッドとして利用ができる。<br>
だが、継承などで誤って上書きしてしまうことなどがあるため、Appleのガイドラインでは居所的メソッドに特定の接頭辞を付けることが推奨されている。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.3"><span></span> 動的束縛とは</a></h4>
Objective-Cでは送られてきたメッセージに対応してどのメソッドが実行されるかは実行時に決定します。その方式を動的束縛、動的結合と呼ぶ<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.4"><span></span> ポリモーフィズム</a></h4>
同じメッセージを送っても、レシーバーのオブジェクトに応じて適当なメソッドを呼ぶ性質をポリモーフィズムと呼ぶ。<br>
<pre>
[target move:direction];
</pre>
この場合、変数targetがポリモーフィズムくを実現しているオブジェクトならば、オブジェクトtargetが受け取ったメッセージにより、どういう処理をするかを決めればいい。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.5"><span></span> 空のポインタnil</a></h4>
ポインタが実体を何も示していないことを表すためにnilという値が用意されている。<br>
nilはid型の空のポインタで、値は0になる。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.6"><span></span> 型の静的チェック</a></h4>
Objective-Cはコンパイル時に型チェックを行います。<br>
id型は(void *)のように何でも適応できてしまう型なので、型チェックができなくて困るので、<br>
クラス名を型名にちゃんと使ったほうがよい。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.7"><span></span> プログラミングにおける型宣言</a></h4>
<pre>
- (id)cellAtRow:(int)row column:(int)col;
</pre>
おのようなセレクタと型情報を合わせたものをシグネチャと呼ぶことがあります。<br>
Objective-Cにおいては基本的に、同じセレクタを持つメッセージは引数や返り値の型(シグネチャ0を同じにすべきである。<br>
<h5> オーバーローディング</h5>
CやJavaなどで引数の型などが違うプロトタイプを複数宣言して、渡す引数によって処理を選択できることを多重定義、オーバーローディングという。<br>
Objective-Cは動的束縛で実行時に引数の型が決定されるため、このような多重定義は行えない。<br>
代わりに、以下のようにメッセージセレクタ(ラベル)の違いによりオーバーロードが可能であるとも言える。<br>
<pre>
- (int) test1;
- (int) test1: (int) a1;
- (int) test1: (int) a1 arg2: (int) a2;
</pre>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.8"><span></span> @class クラスの前方前言</a></h4>
ヘッダー内で、特定のクラスの型を使いたい場合、そのクラスのヘッダーファイルを読み込むと再帰的に読み込みが起きたりするため、代わりに@classディレクティブでクラス名の使用を宣言します。<br>
<pre>
@class Volume;
</pre>
という感じでVolumeというクラスを使うことを宣言できます。これをクラス名の前方宣言という。<br>
(実装部では使用するクラスのヘッダーファイルが必要になるかもしれないが)<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.9"><span></span>インスタンス変数の隠蔽</a></h4>
Objective-Cでは基本的にオブジェクトの外からインスタンス変数にアクセスすることを許可しません。<br>
<h5> アクセサ</h5>
インスタンス変数には直接アクセスしないで、アクセサというgetter/setterを通してアクセスするのが普通です。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.10"><span></span>クラスオブジェクト</a></h4>
クラスオブジェクトはオブジェクトして機能するために、それ独自の変数やメソッドをもっています。<br>
インスタンス変数 &lt;-&gt; クラス変数<br>
インスタンスメソッド &lt;-&gt; クラスメソッド、ファクトリーメソッド<br>
クラスメソッドはファクトリーメソッドとも言われることがあり、allocなどが典型的な例です。<br>
<h5> クラス変数</h5>
Objective-Cはクラス変数が構造上ありませんが、static指定子を使い変数を宣言したものをクラス変数の代用とすることもできる。<br>
Objective-Cのクラス変数は基本的に外部に公開してつかうものではない。<br>
<h4><a href="http://efcl.info/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#k129p0.11"><span></span> イニシャライザを返す型</a></h4>
Objective-Cではイニシャライザを返す型は一般的にidがたにしておくべき。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_Chagiwara_2_0/CHAPTER03_CHAPTER04#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>CHAPTER01-02</title>
		<link>http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#tm1314092969</link>
		<guid>http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02</guid>
		<category>Objective-C</category>
		<pubDate>Tue, 23 Aug 2011 09:45:03 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.1"><span></span> オブジェクトの属性</a></h4>
Objective-Cでは他のオブジェクトを参照するための変数のことをことをアウトレットと呼ぶ。<br>
Interface Builderではこの用語が使用されている。<br>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.2"><span></span> メッセージ式</a></h4>
<pre>
[obj msg];
</pre>
いわゆる関数を呼ぶためにobjはメッセージ(msg)を処理した結果の値を返す。<br>
これをメッセージ式と呼ぶ(関数呼び出しのこと)<br>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.3"><span></span> メッセージセレクタ</a></h4>
関数を関数名で呼ぶように、メッセージ(msgの部分)をメッセージセレクタ、セレクタ、メソッド名と呼ぶ。<br>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.4"><span></span> インスタンスの生成と初期化</a></h4>
alloc,initで行うことが大抵。<br>
<pre>
[[クラス名 alloc] init];
</pre>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.5"><span></span> クラスの実装部</a></h4>
メソッドの定義中で、そのメソッドの使ってるインスタンスオブジェクト自体を表したい時はselfを使う。selfはインスタンスオブジェクトを示す。<br>
<h4><a href="http://efcl.info/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#k128p0.6"><span></span> 静的な変数定義</a></h4>
static指定子を使うことで、静的な変数を定義できる。<br>
また、static変数ははインスタンスオブジェクト分できるのではなく、インスタンスしたオブジェクトで共有される。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_C/hagiwara_2_0/CHAPTER01_02#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>詳解 Objective-C 2.0 改訂版</title>
		<link>http://efcl.info/adiary/Objective_C/hagiwara_2_0#tm1314091867</link>
		<guid>http://efcl.info/adiary/Objective_C/hagiwara_2_0</guid>
		<category>Objective-C</category>
		<pubDate>Tue, 23 Aug 2011 09:08:52 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<div style="margin-bottom:0px"><div style="float:left"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797361786/book042-22/ref=nosim/"><img src="http://ecx.images-amazon.com/images/I/41aYUviRN3L._SL160_.jpg" alt="詳解 Objective-C 2.0 改訂版" style="border:none" /></a></div><div style="float:left;margin-left:15px;line-height:120%"><div style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797361786/book042-22/ref=nosim/">詳解 Objective-C 2.0 改訂版</a><div style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted at 2011.8.23</div></div><div>荻原 剛志<br />ソフトバンククリエイティブ<br />売り上げランキング: 30353<br /></div><div style="margin-top:10px;margin-bottom:10px"></div><div style="margin-top:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797361786/book042-22/ref=nosim/">Amazon.co.jp で詳細を見る</a></div></div><div style="clear:left"></div></div><br>
<br>
<a href="http://www.sbcr.jp/products/4797361780.html">ソフトバンク クリエイティブ:詳解 Objective-C 2.0 改訂版</a><br>
詳細な目次は存在しません。<br>

</div>

<hr>
<h4><a href="/adiary/Objective_C/hagiwara_2_0#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_C/hagiwara_2_0#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Cocoaの素@ITのメモ</title>
		<link>http://efcl.info/adiary/Objective_C/Cocoa_IT#tm1311242647</link>
		<guid>http://efcl.info/adiary/Objective_C/Cocoa_IT</guid>
		<category>Objective-C</category>
		<pubDate>Tue, 19 Jul 2011 09:07:13 GMT</pubDate>
		<author>azu</author>
		<description><![CDATA[<div>
<ul>
	<li><a href="http://www.atmarkit.co.jp/fcoding/index/objc.html">Cocoaの素、Objective-Cを知ろう － ＠IT</a></li>
</ul>
</div>

<div>
<h3><a href="http://efcl.info/adiary/Objective_C/Cocoa_IT#k126p1"><span>■</span></a><a href="http://www.atmarkit.co.jp/fcoding/articles/objc/03/objc03a.html">Objective-Cのクラス定義を理解しよう - ＠IT</a></h3>
ObjCでコンパイラディレクティブを使ってから、それがどういう意味なのかっていう展開より、<br>
逆にgetter/setterはこういう感じで作れて、@propertyと@synthesizeを使うと簡単にできるよって順番でやった方が分かりやすい気がする。まあ人によりますね。<br>
そういう意味で、このコラムは用語の意味が分かりやすい。<br>
<p><a href="http://efcl.info/adiary/Objective_C/Cocoa_IT#k126p1">続きを読む</a></p>
</div>

<hr>
<h4><a href="/adiary/Objective_C/Cocoa_IT#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/adiary/Objective_C/Cocoa_IT#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
</channel>
</rss>

