<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TokyoHeadTerminal &#187; たのしいCocoa</title>
	<atom:link href="http://www.head-t.com/tag/cocoa/feed" rel="self" type="application/rss+xml" />
	<link>http://www.head-t.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Feb 2012 05:40:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>【たのしいCocoa】08_コレクション</title>
		<link>http://www.head-t.com/2009/02/2009-02-01_01.html</link>
		<comments>http://www.head-t.com/2009/02/2009-02-01_01.html#comments</comments>
		<pubDate>Sun, 01 Feb 2009 13:11:04 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://www.head-t.com/?p=1760</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 コレクション 複数のオブジェクトをまとめておくためのクラスのことを、コレクションクラスと呼ぶ。 配列 NSArray  [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7538" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2009/02/2009-02-01_01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2009/02/2009-02-01_01-350x106.jpg" alt="【たのしいCocoa】08_コレクション" title="【たのしいCocoa】08_コレクション" width="350" height="106" class="size-medium wp-image-7538" /></a><p class="wp-caption-text">【たのしいCocoa】08_コレクション</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>コレクション</h3>
<p>複数のオブジェクトをまとめておくためのクラスのことを、コレクションクラスと呼ぶ。</p>
<h4>配列</h4>
<h5>NSArray と NSMutableArray</h5>
<p>例えば、NSString のインスタンスをまとめておく配列は次のようになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> names<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">5</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<h5>配列の作成</h5>
<h6>1個のオブジェクトを指定して作成</h6>
<p>1個だけオブジェクトを指定して配列を作る方法。<strong>arrayWithObject:</strong> というメソッドを使う。</p>
<p><strong>NSArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> arrayWithObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
オブジェクト object を指定して、インスタンスを作成する</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 文字列1つを含む配列を作る</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;name&quot;</span>;
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObject<span style="color: #002200;">:</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<h6>複数のオブジェクトを指定して作成</h6>
<p>複数のオブジェクトを指定するには、<strong>arrayWithObjects:</strong> 、<strong>initWithObject:</strong> というメソッドを使う。</p>
<p><strong>NSArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> arrayWithObjects<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> firstObj, ...
 <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithObjects<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> firstObj, ...
 複数のオブジェクトを指定して、インスタンスを作成する。引数の最後には <span style="color: #a61390;">nil</span> を指定する。</pre></td></tr></table></div>

</p>
<p>このメソッドは可変変数を使う。複数指定した引数の最後には必ず nil を指定する。nil を渡すことで、オブジェクトの引数はここまで、という宣言になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 引数の文字列を指定して、配列を作成する</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array;
array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// array は、&quot;A&quot;、&quot;B&quot;、&quot;C&quot;を含む大きさ3の配列になる。</span></pre></td></tr></table></div>

</p>
<p>引数の最後の nil を忘れると、ほとんどの場合アプリケーションがクラッシュする。</p>
<h5>配列の大きさ</h5>
<p>配列の大きさを調べるには、<strong>count</strong> というメソッドを使う。</p>
<p><strong>NSArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span> count
配列に含まれる要素の数を取得する</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 配列を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 配列の大きさを表示する</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;count is %d, [array count]);
// count は、3になる</span></pre></td></tr></table></div>

</p>
<h5>インデックスを指定したオブジェクトの取得</h5>
<p>配列の中にあるオブジェクトを取り出すためには、<strong>objectAtIndex:</strong> というメソッドを使う。</p>
<p><strong>NSArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index
インデックス index を指定して、要素を取得する</pre></td></tr></table></div>

</p>
<p>例えば、3番目のオブジェクトを取り出すには以下のようになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 配列を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 3番目のオブジェクトを取得する</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> thirdObject <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>array objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>thirdObject<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// thirdObject は、&quot;C&quot;になる</span></pre></td></tr></table></div>

</p>
<p>インデックスが配列の大きさを超えてしまうと例外が発生してしまう。それを防ぐには、オブジェクトを取り出す前に配列の大きさをチェックする。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// objectAtIndex: でアクセスする前に、count を使って配列の大きさをチェックする</span>
<span style="color: #11740a; font-style: italic;">// ここでは2より大きい、つまり3以上あるかどうか調べている</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">int</span> index <span style="color: #002200;">=</span> <span style="color: #2400d9;">2</span>;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>array count<span style="color: #002200;">&#93;</span> &gt; index<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> thirdObject;
    thirdObject <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>array objectAtIndex<span style="color: #002200;">:</span>index<span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>objectAtIndex: と for 文を利用すれば、配列の中にあるすべてのオブジェクトにアクセスすることができる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 配列を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSArrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 配列の大きさだけ、 for ループを回す</span>
<span style="color: #a61390;">int</span> i;
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; i &lt; <span style="color: #002200;">&#91;</span>array count<span style="color: #002200;">&#93;</span>; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// インデックスを指定して、オブジェクトを取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>array objectAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>for 文の中で、count メソッドを使って配列の大きさをチェックしている。実行すると i は0から2まで変化することになる。それぞれの値で objectAtIndex: を呼び出すから全てのオブジェクトを取り出すことができる。</p>
<h5>NSEnumerator を使ったオブジェクトの取得</h5>
<p>for 文を使う以外に、<strong>列挙子</strong>と呼ばれる考え方を使うものもある。<br />
<strong>NSEnumerator</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>nextObject
現在のオブジェクトの、次のオブジェクトを取得する</pre></td></tr></table></div>

</p>
<p>NSEnumerator を取得したら、このメソッドを呼び続ける。そうして全てのオブジェクトを次々と取り出せる。<br />
  NSArray で NSEnumerator を利用する場合は、<strong>objectEnumerator</strong> というメソッドを使う。</p>
<p><strong>NS Array</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEnumerator</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>objectEnumerator
列挙子を取得する</pre></td></tr></table></div>

</p>
<p>取得したら、while 文を使ってループを回ることになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 配列を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 列挙子を取得する</span>
<span style="color: #400080;">NSEnumerator</span><span style="color: #002200;">*</span> enumerator;
enumerator <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>array objectEnumerator<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// while 文を使って、NSEnumerator の nextObject を繰り返し呼び出す。</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;
<span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>enumerator nextObject<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// 取り出した文字列に対して処理を行う</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>nextObject メソッドを使ってオブジェクトを取り出して、それを string に代入している。その string の値が、while ループを続けるかどうかの条件になっている。値が入っていればループは続き、最後のオブジェクトになって nil が返ってくればループは終了する。 </p>
<h5>高速列挙を使ったオブジェクトの取得</h5>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 配列を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 高速列挙を使って、オブジェクトにアクセスする</span>
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #a61390;">in</span> array<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// 取り出した文字列に対して処理を行う</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>for 文に対して拡張が行われていて、直接配列にアクセスすることができる。文法的には以下のようになる</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>変数宣言 <span style="color: #a61390;">in</span> オブジェクトの集合） <span style="color: #002200;">&#123;</span>
...
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>for 文の中で変数の宣言を行い、in というキーワードを置く。その後にオブジェクトの集合となるクラスがくる。オブジェクトの集合としては NSArray などを指定することができる。高速列挙は、NSWnumerator を使うものと比べると、ソースコードの記述量が格段に少なくなる。</p>
<h5>オブジェクトの追加と削除</h5>
<h6>空の配列を作成</h6>
<p>空の配列を作っておいて、あとからオブジェクトを追加することもできる。</p>
<p><strong>NSArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>array
中身が空のインスタンスを作成する</pre></td></tr></table></div>

</p>
<h6>オブジェクトの追加</h6>
<p>オブジェクトを追加するためのメソッドは、NSMutableArray で定義されている。</p>
<p><strong>NSMutableArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
オブジェクト object を追加する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObjectsFormArray<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSArra<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>array
配列 array に含まれている全てのオブジェクトを追加する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>insertObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object atIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>Index
オブジェクト object をインデックス index　に追加する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>replaceObjectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index withObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
インデックス index にあるオブジェクトを、オブジェクト object と置換する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setArray<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>array
すべてのオブジェクトを、配列 array に含まれているオブジェクトと交換する</pre></td></tr></table></div>

</p>
<p>インデックスを指定するものは、配列を越えると例外が発生してしまうので注意。使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 空配列を作る</span>
<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSmutableArray array<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// オブジェクトを追加する</span>
<span style="color: #002200;">&#91;</span>array addObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 配列に含まれるオブジェクトを追加する</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;D&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>array addObjectsFromArray<span style="color: #002200;">:</span>array1<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// オブジェクトを挿入する</span>
<span style="color: #002200;">&#91;</span>array insertObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;E&quot;</span> atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// オブジェクトを置き換える</span>
<span style="color: #002200;">&#91;</span>array replaceObjectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span> withObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;F&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>, array<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// 最終的な配列は、&quot;E&quot;、&quot;F&quot;、&quot;B&quot;、&quot;C&quot;、&quot;D&quot;</span></pre></td></tr></table></div>

</p>
<h6>オブジェクトの削除</h6>
<p><strong>NSMutableArray</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeAllObjects
すべてのオブジェクトを削除します
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeLastObject
最後のオブジェクトを削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeObjectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index
インデックス index にあるオブジェクトを削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
配列に含まれるオブジェクトで、オブジェクト object と同じ値を持つものをすべて削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>remobeObjectIdentialTo<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
配列に含まれるオブジェクトで、オブジェクト object と同じものをすべて削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeObjectsInArray<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>array
配列に含まれるオブジェクトで、配列 array に含まれるオブジェクトと同じ値を持つものをすべて削除する</pre></td></tr></table></div>

</p>
<h4>辞書</h4>
<h5>辞書とは</h5>
<p>あるオブジェクトを指定すると、それに関連づけられたオブジェクトを指定することができる。たとえば、ある Mac の情報をこのようにまとめておける。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #bf1d1a;">&quot;CPU&quot;</span> <span style="color: #002200;">=</span>&gt; <span style="color: #bf1d1a;">&quot;Intel Core 2 Duo&quot;</span></pre></td></tr></table></div>

</p>
<p>CPU が<strong>キー</strong>で、Intel Core 2 Duo が<strong>値</strong>。</p>
<h5>NSDictionary と NSMutableDictionary</h5>
<p>Cocoa で辞書を実現するのは、変更できない辞書 NSDictionary と、変更できる辞書 NSMutableDictionary というクラス。</p>
<h5>NSDictionary の作成</h5>
<h6>1つのキーの値のペアを指定して作成</h6>
<p><strong>NSDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>dictionaryWithObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object forKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key
値 object とキー key を指定して、インスタンスを作成する</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// キーと値のペアを指定して辞書を作る</span>
<span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> dict;
dict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSDictionaryWithObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<h6>複数のキーと値のペアを指定して作成</h6>
<p><strong>NSDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>dictionaryWithObjects<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>objects forKeys<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>keys
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithObjects<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>objects forKeys<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>keys
値の配列 objects とキーの配列 keys を指定して、インスタンスを作成する
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>firstObj, ...
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithObjectsAndKeys<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>firstObj, ...
値とキーのペアを複数指定して、インスタンスを作成する。最後の引数は <span style="color: #a61390;">nil</span> にする。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// キーと値の配列を指定して辞書を作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> keys;
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> objects;
<span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> dict0;
keys <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Memory&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Color&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
objects <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;2GB&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Black&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
dict0 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObjects<span style="color: #002200;">:</span>ojects forKeys<span style="color: #002200;">:</span>keys<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// キーと値のペアを引数として指定して、辞書を作る</span>
<span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> dict1;
dict1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;2GB&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Memory&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Black&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Color&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<h5>キーと値の取得</h5>
<h6>キーを指定して値を取得</h6>
<p>作った辞書を引くためには、objectForKey: というメソッド。</p>
<p><strong>NSDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>objectForKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key
キー key を指定して、関連づけられている値を取得する。対応する値がない時は <span style="color: #a61390;">nil</span> を返す。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 辞書を作る</span>
<span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> dict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithOjectAndKeys<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;2GB&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Memory&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Black&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Color&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// キー&quot;CPU&quot;を取得して、対応する値を取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> cpuType <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// cpuTypeには、&quot;Core 2 Duo&quot;が入る</span></pre></td></tr></table></div>

</p>
<h6>すべてのキー、値を取得</h6>
<p>辞書に含まれるすべてのキーと値を取得することもできる。</p>
<p><strong>NSDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>allkeys
すべてのキーを配列の形で取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEnumerator</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>keyEnumerator
すべてのキーにアクセスする列挙子を取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>allValues
すべての値を配列の形で取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEnumerator</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>objectEnumerator
すべての値にアクセスする列挙子を取得する</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 辞書を作る</span>
<span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> dict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;2GB&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Memory&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Black&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Color&quot;</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// キーのための列挙子を取得する</span>
<span style="color: #400080;">NSEnumerator</span><span style="color: #002200;">*</span> enumerator <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dict keyEnumerator<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// すべてのキーを取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> key;
<span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span>key <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>enumerator nextObject<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// キーに対する値を取得する</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> value;
value <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dict objectForKey<span style="color: #002200;">:</span>key<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// キーと値のペアに対する処理</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;key is %@, value is %@&quot;</span>, key, value<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>まず keyEnumerator メソッドで列挙子を取得して、while 文を回す。これでキーを順々に取り出すことができる。</p>
<h5>キーと値の追加と削除</h5>
<h6>空の辞書を作成</h6>
<p><strong>NSDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>dictionary
中身が空の辞書を作成する</pre></td></tr></table></div>

</p>
<h6>キーと値のペアを追加</h6>
<p><strong>NSMutableDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object forKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key</pre></td></tr></table></div>

</p>
<p>どちらの値も nil にならないように気をつける。使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 空の辞書を作る</span>
<span style="color: #400080;">NSMutableDictionary</span><span style="color: #002200;">*</span> dict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> dictionary<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// キーと値をペアで追加する</span>
<span style="color: #002200;">&#91;</span>dict setObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Core 2 Duo&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CPU&quot;</span>;
<span style="color: #002200;">&#91;</span>dict setObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;2GB&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Memory&quot;</span>;
<span style="color: #002200;">&#91;</span>dict setObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Black&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Color&quot;</span>;</pre></td></tr></table></div>

</p>
<h6>キーと値のペアを削除</h6>
<p><strong>NSMutableDictionary</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeAllObjects
すべてのキーと値のペアを削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeObjectForKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key
キー key と、それに関連づけられているオブジェクトを削除する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>removeObjectsForKeys<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>keyArray
キーの配列 keyArray と、それに含まれているキーに関連づけられているオブジェクトを削除する</pre></td></tr></table></div>

</p>
<h4>ラッパークラス</h4>
<h5>ラッパークラスとは</h5>
<p>NSArray と NSDictionary という2つのコレクションクラスに入れることができるのは、オブジェクトになる。整数や小数や理論値などの数値を入れるには、int や float や BOOL といった基本型を使う。ラッパークラスでこれらの基本型を包んで、オブジェクトとして扱えるようにするクラス。</p>
<h5>NSNumber</h5>
<p>基本型からインスタンスを作るためのメソッド。</p>
<p><strong>NSNumber</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithBool<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithBool<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>value
理論値型の値 value を指定してインスタンスを作成する
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithChar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithChar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithUnsignedChar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithUnsignedChar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>value
文字型の値 value を指定してインスタンスを作成する
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithInt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithInt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithUnsignedInt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithUnsignedInt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithLong<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithLong<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithUnsignedLong<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithUnsignedLong<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>value
整数型の値 value を指定して、インスタンスを作成する
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithFloat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithFloat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>numberWithDouble<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span><span style="color: #002200;">&#41;</span>value
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithDoouble<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span><span style="color: #002200;">&#41;</span>value
小数型の値 value を指定してインスタンスを作成する</pre></td></tr></table></div>

</p>
<p>取り出す方のメソッドは以下。</p>
<p><strong>NSNumber</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>boolvalue
論理値型の値を取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>charValue
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span><span style="color: #002200;">&#41;</span>unsingnedCharValue
文字型の値を取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>intValue
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>unsingned <span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>unsingnedIntValue
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>longValue
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">long</span><span style="color: #002200;">&#41;</span>unsignedLongValue
整数型の値を取得す
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span>floatValur
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span><span style="color: #002200;">&#41;</span>doubleValue
小数型の値を取得する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>stringValue
値を文字列にしたものを取得する</pre></td></tr></table></div>

</p>
<p>これらの値を取り出すメソッドは、インスタンスを作成したときの基本型によらず、どの型としてでも取り出すことができる。また、<strong>stringValue</strong> を使うと、今の値を文字列として取り出すことができる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 空の文字列を作る</span>
NSMUtableArray<span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #a61390;">int</span> i;
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>i<span style="color: #002200;">=</span><span style="color: #2400d9;">0</span>; i&lt;<span style="color: #2400d9;">0</span>; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// 整数型を指定して、NSNumber クラスを作る</span>
<span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> number <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> numberWithInt<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 配列に追加する</span>
<span style="color: #002200;">&#91;</span>array addObject<span style="color: #002200;">:</span>number<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<h4>オブジェクトの同等性と同値性</h4>
<h5>同じ値を持つオブジェクト</h5>
<p>異なるインスタンスでありながら同じ値を持っていることを<strong>同値</strong>である、インスタンス自体が同じであることを<strong>同等</strong>であるという。</p>
<h5>同値性と同等性の判定</h5>
<p>同等性のチェックは比較演算子 <strong>==</strong> を使う。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// オブジェクトの同等性をチェックする</span>
<span style="color: #a61390;">id</span> objectA, objectB;
objectA <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;stringA&quot;</span>;
objectB <span style="color: #002200;">=</span> objectA;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>objectA <span style="color: #002200;">==</span> objectB<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// objectA と objectB は同等</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>同値性は <strong>isEqual:</strong> というメソッドを使う。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>isEqual<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object
オブジェクト object が、このインスタンスと等しいかを返す。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// NSArray のインスタンスを2つ作る</span>
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array0 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> array1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// array0 と array1 の同等性を調べる</span>
<span style="color: #a61390;">BOOL</span> result;
result <span style="color: #002200;">=</span> array0 <span style="color: #002200;">==</span> array1;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;array == array1, %d, result);
// result は NO になる
&nbsp;
// array0 とarray1 の同値性を調べる
result = [array0 isEqual:array1];
NSLog(@&quot;</span><span style="color: #002200;">&#91;</span>array0 isEqual<span style="color: #002200;">:</span>array1<span style="color: #002200;">&#93;</span>, <span style="color: #002200;">%</span>d, result<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// result は YES になる</span></pre></td></tr></table></div>

</p>
<p>同等ではないが同値であるということになる。</p>
<h4>コレクションクラスと参照カウンタ</h4>
<p>コレクションクラスにオブジェクトを追加すると、コレクションクラスがそのオブジェクトを保持することになり、参照カウンタが1上がる。</p>
<h5>NSArray と参照カウンタ</h5>
<p>NSArray が開放されるときには、そこに登録されているオブジェクト全てに release が送られる。一度 NSArray に入れれば、そのオブジェクトを保持する必要があったとしても release しても構わない。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 空の配列を作成する</span>
<span style="color: #11740a; font-style: italic;">// この array という変数は、インスタンス変数として宣言されているものとする</span>
array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// NSString インスタンスを作る</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> iniWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;New String&quot;</span>encoding<span style="color: #002200;">:</span>NSASCIIStringEncoding<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// この時点で参照カウンタは1</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// 配列に追加する</span>
<span style="color: #002200;">&#91;</span>array addObject<span style="color: #002200;">:</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// string の retain メソッドが呼び出される。参照カウンタは2になる</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// string の release メソッドを呼び出す</span>
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> release<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 参照カウンタは1になる</span>
<span style="color: #11740a; font-style: italic;">// これで NSArray がこのオブジェクトの開放に責任を持つことになる</span></pre></td></tr></table></div>

</p>
<h5>NSDictionary と参照カウンタ</h5>
<p>値に関しては NSArray と同じ。NSDictionary に追加された時点で retain される。キーに関しては少し違って、NSDictionary に追加しようとすると、キーのオブジェクトはコピーされて、コピーされた方が追加される。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2009/02/2009-02-01_01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】07_文字列</title>
		<link>http://www.head-t.com/2009/01/2009-01-07-01.html</link>
		<comments>http://www.head-t.com/2009/01/2009-01-07-01.html#comments</comments>
		<pubDate>Wed, 07 Jan 2009 14:17:42 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=142</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 文字列 文字列のためのクラス Cocoa では文字列のためのクラスを独自に用意している。 NSString と NSM [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7551" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2009/01/2009-01-07_01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2009/01/2009-01-07_01-350x132.jpg" alt="【たのしいCocoa】07_文字列" title="【たのしいCocoa】07_文字列" width="350" height="132" class="size-medium wp-image-7551" /></a><p class="wp-caption-text">【たのしいCocoa】07_文字列</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>文字列</h3>
<h4>文字列のためのクラス</h4>
<p>Cocoa では文字列のためのクラスを独自に用意している。</p>
<h4>NSString と NSMutableString</h4>
<p>NSString クラスは内容を変更しない文字列を表す。NSMutableString は内容を変更できる文字列。NSString は一度インスタンスを作成するとテキストを変更できないので、ウィンドウのタイトルを取得するときやボタンのタイトルを取得するときに使う。</p>
<h4>テキストエンコーディング</h4>
<p><strong>■ NSString の文字コードは Unicode</strong></p>
<p>NSString も内部に保持する文字列のコードとして Unicode を使っているので、英語も日本語も NSString で表現することが可能。</p>
<h4>文字列の作成</h4>
<p><strong>■ @&#8221;" を使った作成</strong></p>
<p>C言語とは1箇所だけ異なり、ダブルクォーテーションの前に <strong>@</strong> を付ける。これが付くと、Ｃ言語の文字列、つまり char の配列ではなく、NSString のインスタンスになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// C文字列</span>
<span style="color: #a61390;">char</span><span style="color: #002200;">*</span> cString <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;This is C string&quot;</span>;
<span style="color: #11740a; font-style: italic;">// NSString インスタンス</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;This is NSString&quot;</span>;</pre></td></tr></table></div>

</p>
<p><strong>■ 日本語文字列からの作成</strong></p>
<p><strong>@</strong> を使った NSString の作成は、アルファベットでしか使えない。日本語文字列を使う目的がウィンドウのタイトルやボタンに表示する文字列の場合は、外部ファイルにその文字列を書いて適時読み込んで文字列を得るようにした方が、日本語以外の言語にローカライズする時の柔軟性が増す。 ただ、デバッグなどで日本語を使いたい場合には、C言語の文字列から NSString インスタンスと作るメソッド<strong>stringWithCString:encodeing:</strong> 、または <strong>initWithCString:encoding</strong> を使う。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> cha<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>cString
　encoding<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span>encoding
<span style="color: #002200;">-</span> initWithCString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>cString
　encoding<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span>encoding
C言語の文字列 cString と、そのテキストエンコーディング encoding を指定して、インスタンスを作る。</pre></td></tr></table></div>

</p>
<p>前者の方は、自動開放されたインスタンスを作成する。後者は <strong>alloc</strong> の後で呼び出す初期化メソッド。</p>
<p>2つ目の引数にエンコーディングを指定する。「表示 > テキスト > ファイルエンコーディング」メニューで例えば、日本語（Shift JIS）にする。そして、次のようなコードで文字列を作る。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> jpString;
jpString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;日本語文字列&quot;</span>
	encoding<span style="color: #002200;">:</span>NSShiftJISStringEncoding<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>C言語の文字列なので、引数の文字列には <strong>@</strong> を付けないこと。</p>
<p>この方法はあくまで一時的な回避策として使う。</p>
<p><strong>■ フォーマットからの作成</strong></p>
<p>printf 文で指定するものと同じで置換子を使う、<strong>フォーマット</strong>を指定して文字列を作成することもできる。</p>
<p><strong>stringWithFormat:</strong> というメソッドを使用し、printf と同様に可変引数を使う。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>format...
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>format...
フォーマット format を指定して、インスタンスを作る</pre></td></tr></table></div>

</p>
<p>フォーマット自体も NSString（つまり @ 付きの文字列）で指定すること。このメソッドで使うことのできる置換子は printf のものとほぼ同じで、さらに NSString のインスタンスも指定できる。下記はよく使う置換子の一覧。</p>
<table>
<tr>
<th>置換子</th>
<th>説明</th>
</tr>
<tr>
<td>%@</td>
<td>NSString のインスタンス</td>
</tr>
<tr>
<td>%d、%D、%i</td>
<td>整数</td>
</tr>
<tr>
<td>%u、%U</td>
<td>符号なしの整数</td>
</tr>
<tr>
<td>%x</td>
<td>符号なしの整数を、小文字の16進数で表現</td>
</tr>
<tr>
<td>%X</td>
<td>符号なしの整数を、大文字の16進数で表現</td>
</tr>
<tr>
<td>%f</td>
<td>小数</td>
</tr>
<tr>
<td>%c</td>
<td>文字</td>
</tr>
<tr>
<td>%s</td>
<td>C言語の文字列</td>
</tr>
<tr>
<td>%%</td>
<td>%記号そのものを表現</td>
</tr>
</table>
<p>下記は使用例</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringA;
<span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac&quot;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// NSString のインスタンスを指定して、文字列を作る</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringB;
stringB <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@ Pro&quot;</span>, stringA<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringB<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringB は、&quot;Mac Pro&quot;になる</span>
<span style="color: #11740a; font-style: italic;">// 整数を指定して文字列を作る</span>
<span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #2400d9;">80</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringC;
stringC <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSStringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d%%&quot;</span>, i<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringD<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringD は&quot;0x50&quot;になる</span></pre></td></tr></table></div>

</p>
<p><strong>■ NSRange</strong></p>
<p><strong>NSRange</strong> はいろいろなクラスで補助的に使われる構造体。ある<strong>範囲</strong>を表す。例えば、10文字の文字列を操作するときに「5文字目から3文字分」といったように範囲指定するときに使う。NSRange の定義は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">type <span style="color: #a61390;">struct</span> _NSRange <span style="color: #002200;">&#123;</span>
　<span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> location;
　<span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> length;
<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">NSRange</span>;</pre></td></tr></table></div>

</p>
<p><strong>location</strong> と <strong>length</strong> という2つのフィールドがある。それぞれ、範囲のスタート位置と、長さを表す。NSRange を使うときの便利関数として <strong>NSMakeRange</strong> というものがある。これを使うと、location と length を指定して NSRange を作ることができる。</p>
<p><strong>NSRange</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> location, <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> length<span style="color: #002200;">&#41;</span>;
範囲のスタート位置 location と、長さ length を指定して、<span style="color: #a61390;">NSRange</span> を作る</pre></td></tr></table></div>

</p>
<p>以下はその使用例</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// NSRange を作る</span>
<span style="color: #a61390;">NSRange</span> range <span style="color: #002200;">=</span> NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">5</span><span style="color: #002200;">&#41;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;location is %d, length is %d&quot;</span>, range.location, range.length<span style="color: #002200;">&#41;</span>;</pre></td></tr></table></div>

</p>
<h4>文字列の操作</h4>
<p><strong>■ 文字列の長さ</strong></p>
<p>文字列の長さを調べるには length メソッドを使う。</p>
<p><strong>NSObject</strong> &#8211; (unsigned int) length 文字列の長さを、文字数で取得する</p>
<p>length メソッドは言語に関わらず、バイト数ではなく<strong>文字数</strong>を調べる。使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;
<span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span>;
&nbsp;
<span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> length;
length <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> length<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;length is %d&quot;</span>, length<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// length は8になる</span></pre></td></tr></table></div>

</p>
<p><strong>■ 文字列の連結、挿入、削除</strong></p>
<p>文字列をつないだり一部を変更するためのメソッド。<strong>stringByAppendingString:</strong>、<strong>stringByAppendingFormat:</strong> というメソッドを使う。</p>
<p><strong>2つの文字列の連結</strong></p>
<p>ある文字列の後に別の文字列をくっつけて、新しい文字列を作るもの。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>stringByAppendingString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
自分自身に、文字列 <span style="color: #a61390;">string</span> を連結した新しい文字列を作成して返す
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">&#41;</span>stringByAppendingFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>format,...
自分自身に、format で指定された文字列を連結した新しい文字列を作成して、返す。</pre></td></tr></table></div>

</p>
<p>使用例は以下</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringA <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringB <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Leopard&quot;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// stringA と stringB をつなげる</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringC <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringA stringByAppendingString<span style="color: #002200;">:</span>stringB<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringC<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringC は、&quot;Mac OS X Leopard&quot;となる</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//　stringBに、文字列をつなげる</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringD <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringB stringByAppendingFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; %d.%d, 10, 5];
NSLog(stringD);
// stringD は、&quot;</span>Leopard <span style="color: #2400d9;">10.5</span><span style="color: #bf1d1a;">&quot;となる</span></pre></td></tr></table></div>

</p>
<p>このメソッドでは、stringA と stringB から、stringC という新しい文字列を作っている。この処理をした後でも stringA と stringB の値は変わらない。似たような方法として、<strong>stringWithFormat:</strong> メソッドを使ってもいい。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// stringA と stringB から、文字列を作成する</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringE <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@%@&quot;</span>, stringA, stringB<span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringE<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringE は、&quot;Mac OS X Leopard&quot;となる</span></pre></td></tr></table></div>

</p>
<p><strong>NSMutableString の作成</strong></p>
<p>可変文字である <strong>NSMutableString</strong> を使う方法もある。一度作ったインスタンスの文字列を変更できる。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">string</span>
空文字列のインスタンスを作る
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stringWithString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
文字列 <span style="color: #a61390;">string</span> と同じ内容のインスタンスを作る</pre></td></tr></table></div>

</p>
<p>string メソッドでは空の文字列を作る。stringWithString: を使えば、NSString から NSMutableString を作ることができる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 文字列を指定して、NSMutableString を作る。</span>
<span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p><strong>文字列の追加</strong></p>
<p>NSMutableString のインスタンスの後に文字列を追加するには、次のメソッドを使う。</p>
<p> <strong>NSMutableString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> appendString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
文字列 <span style="color: #a61390;">string</span> を追加する
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> appendFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>format, ...
format で指定された文字列を追加する</pre></td></tr></table></div>

</p>
<p>stringByAppendingString: や stringByAppendingFormat: は新しいインスタンスを作るのに対して、こちらはすでにあるインスタンスをそのまま使うことになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 空文字列を作成する</span>
<span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 文字列を追加する</span>
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac &quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OS &quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;X&quot;</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// 最終的に文字列は、&quot;Mac OS X&quot;になる</span></pre></td></tr></table></div>

</p>
<p><strong>文字列の挿入</strong></p>
<p>最後だけでなく、好きな箇所に挿入できる。</p>
<p> <strong>NSMutableString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> insertString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span> atIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>insigned<span style="color: #002200;">&#41;</span>index
文字列 <span style="color: #a61390;">string</span> をインデックス index に挿入する</pre></td></tr></table></div>

</p>
<p>インデックスを指定するときは、いまある文字列の範囲を超えないように注意。もし越えてしまったら例外と呼ばれるものが発生して、そこで実行がキャンセルされてしまう。使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 文字列を作成する</span>
<span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac X&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 文字列を挿入する</span>
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> insertString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OS &quot;</span> atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// 文字列は、&quot;Mac OS X&quot;になる</span></pre></td></tr></table></div>

</p>
<p><strong>文字列の削除</strong></p>
<p>文字列を削除するのは <strong>deleteCharactersInRange: </strong>というメソッドを使う。</p>
<p> <strong>NSMutableString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> deleteCharacterInRange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range
範囲 range で指定した文字列を削除する</pre></td></tr></table></div>

</p>
<p>NSRange を使って文字列の範囲を指定する。指定された範囲にある文字列が削除されることになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// 文字列を作成する</span>
<span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 範囲を指定して、文字列を削除する</span>
<span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> deleteCharacterInRange<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// 文字列は、&quot;ac&quot;になる</span></pre></td></tr></table></div>

</p>
<p><strong>■ 文字列の比較</strong></p>
<p><strong>等しいかどうかの比較</strong></p>
<p>2つの文字列が同じ文字列かどうか調べるメソッド、<strong>isEqualToString:</strong>。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> isEqualToString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
文字列 <span style="color: #a61390;">string</span> が、こも文字列と等しかったら <span style="color: #a61390;">YES</span> 、違っていたら <span style="color: #a61390;">NO</span> を返す</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringA <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringB <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringC <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Windows&quot;</span>;
<span style="color: #a61390;">BOOL</span> result;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 文字列を比較する</span>
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringA isEqualToString<span style="color: #002200;">:</span>stringB<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// この結果は YES になる</span>
&nbsp;
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringA isEqualToString<span style="color: #002200;">:</span>stringC<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// この結果は NO になる</span></pre></td></tr></table></div>

</p>
<p><strong>前置子と後置子の比較</strong></p>
<p>文字列がある特定の前置子や後置子を持っているか調べることもできる。つまり、ある文字で始まっているか、またはある文字で終わっているかどうかを調べる。hasPrefix: と hasSuffix を使う。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>hasPrefix<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
この文字列が、文字列 <span style="color: #a61390;">string</span> で始まっているなら <span style="color: #a61390;">YES</span>、そうでないなら <span style="color: #a61390;">NO</span> を返します。
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> hasSuffix<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">string</span>
この文字列が、文字列 <span style="color: #a61390;">string</span> で終わっているなら <span style="color: #a61390;">YES</span>、そうでないなら <span style="color: #a61390;">NO</span> を返す。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringA <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac Pro&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringB <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MacBook&quot;</span>;
<span style="color: #a61390;">BOOL</span> result;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 前置子を調べる</span>
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringA hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac&quot;</span><span style="color: #002200;">&#93;</span>;
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringB hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mac&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 両方とも結果は YES になる</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// 後置子を調べる</span>
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringA hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Pro&quot;</span><span style="color: #002200;">&#93;</span>;
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>stringB hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Pro&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">// 前者は YES 、後者は NO になる。</span></pre></td></tr></table></div>

</p>
<p><strong>■ 文字列の検索</strong></p>
<p>指定した文字列がある範囲を調べることができる。返り値は NSRange になる。検索に関するいろいろなオプションを指定できる。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span> rangeOfString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">&#41;</span>subString
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span> rangeOfString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">&#41;</span>subString options<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>insigned<span style="color: #002200;">&#41;</span>mask
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span> rangeOfString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">&#41;</span>subString options<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>mask range<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range
この文字列の検索をして、文字列 subString がある範囲を返す。検索のためのオプションを mask として指定することや、検索の範囲を range で指定することができる。</pre></td></tr></table></div>

</p>
<p>検索の結果、見つかればその範囲が返ってくる。見つからなかった場合は、返り値の NSRange の location に NSNotFound という値が返ってくる。これを使って、見つかったかどうかのチェックをする。検索のオプションは以下。</p>
<table>
<tr>
<th>オプション</th>
<th>説明</th>
</tr>
<tr>
<td>NSCaseInsensitiveSerch</td>
<td>アルファベットの大文字小文字を無視する</td>
</tr>
<tr>
<td>NSLiteralSerch</td>
<td>文字列をバイトごとに検索する</td>
</tr>
<tr>
<td>NSBackwardSerch</td>
<td>範囲の終わりから検索する</td>
</tr>
<tr>
<td>NSAnchoredSerch</td>
<td>指定した範囲の先頭だけを検索する。文字列の途中に検索文字が出てきても無視する。</td>
</tr>
</table>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;This is Mac OS X&quot;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 文字列を検索する</span>
<span style="color: #a61390;">NSRange</span> range;
range <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> rangeOfString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;Mac OS X&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 見つかった場合</span>
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>range.location <span style="color: #002200;">!=</span> NSNotFound<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Found at Location=%d, length=%d&quot;</span>, range.location, range.length<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// 見つからなかった場合</span>
<span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
　NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Not found&quot;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>■ 文字列の一部を抜き出す</strong></p>
<p>サブストリングの取得と呼ばれるもの。抜き出し方は3通りある。先頭から指定したインデックスまで、指定したインデックスから最後まで、範囲を指定するもの、この3つ。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> substringToIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index
この文字列の、先頭からインデックス index までの文字列を返す。
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> substringFromIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index
この文字列の、インデックスか index から最後までの文字列を返す。
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> substringWithIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span><span style="color: #002200;">&#41;</span>index
この文字列の、範囲 range に含まれる文字列を返す。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Happy Cocoa Programing&quot;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// 先頭から文字列を取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringA;
stringA <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> substringToIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">5</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringA<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringA は、&quot;Happy&quot;となる</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// 最後までの文字列を取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringB;
stringB <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> substringFromIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">12</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringB<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringB は、&quot;Prigraming&quot;となる</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// 範囲を指定して文字列を取り出す</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> stringC;
stringC <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> substringWithRange<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">6</span>,<span style="color: #2400d9;">5</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
NSLog<span style="color: #002200;">&#40;</span>stringC<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">// stringC は、&quot;Cocoa&quot;となる</span></pre></td></tr></table></div>

</p>
<h4>テキストファイルの読み込みと書き出し</h4>
<p><strong>■ テキストファイルの読み込み</strong></p>
<p>テキストファイルを読み込む時は、そのエンコーディングも同時に指定することになる。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stringWithContentsOfFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path
　encoding<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span>encoding
　error<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">**</span><span style="color: #002200;">&#41;</span>error
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithContentsOfFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path
　encoding<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span>encoding
　error<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">**</span><span style="color: #002200;">&#41;</span>error
テキストファイルのパス path とエンコーディング encoding を指定して、ファイルを読み込む。読み込みに失敗した場合、エラー error が返る。</pre></td></tr></table></div>

</p>
<p>使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// テキストファイルを読み込む</span>
<span style="color: #11740a; font-style: italic;">// path には適切なパスを指定する</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> text;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> path <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/Users/local/test.txt&quot;</span>;
<span style="color: #400080;">NSError</span><span style="color: #002200;">*</span> error;
text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithContentsOfFile<span style="color: #002200;">:</span>path
　encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding error<span style="color: #002200;">:&amp;</span>amp;error<span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>text<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　<span style="color: #11740a; font-style: italic;">// 読み込みが成功した場合</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
　<span style="color: #11740a; font-style: italic;">// 読み込みが失敗した場合</span>
　NSLog<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>error localizedDescription<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>■ テキストファイルへの書き出し</strong></p>
<p>指定したエンコーディングに変換されたテキストが、ファイルに保存されることになる。</p>
<p> <strong>NSString</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> writeToFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path
　atomically<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>useAuxiliaryFile
　encoding<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span>encoding
　error<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">**</span><span style="color: #002200;">&#41;</span>error;
パス path とエンコーディング encoding を指定して、テキストをファイルに書き出す。補助ファイルを使うかどうか、useAuxiliaryFile で指定する。書き出しに失敗した場合、エラー error が返る。</pre></td></tr></table></div>

</p>
<p>読み込みの時と同様、パスとエンコーディングを指定する。useAuxiliary は YES にしておく。使用例は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// テキストファイルへ書き出す</span>
<span style="color: #11740a; font-style: italic;">// path には適切なパスを指定する</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cocoa programming&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> path <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/Users/local/test.txt&quot;</span>;
<span style="color: #400080;">NSError</span><span style="color: #002200;">*</span> error;
&nbsp;
<span style="color: #a61390;">BOOL</span> result;
result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>text writeToFile<span style="color: #002200;">:</span>path atomically<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span> encoding<span style="color: #002200;">:</span>NSUTF8StringEncodng error<span style="color: #002200;">:&amp;</span>amp;error<span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>result<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　<span style="color: #11740a; font-style: italic;">// 書き出しが成功した場合</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
　<span style="color: #11740a; font-style: italic;">// 書き出しが失敗した場合</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>error localizedDescription<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2009/01/2009-01-07-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】06_メモリ管理</title>
		<link>http://www.head-t.com/2008/12/2008-12-27-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-27-01.html#comments</comments>
		<pubDate>Fri, 26 Dec 2008 20:08:21 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=140</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 ガベージコレクションによるメモリ管理 ■ ガベージコレクションとは メモリ上の使われなくなったオブジェクトをゴミとみな [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7556" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-27_01-01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-27_01-01-350x132.jpg" alt="【たのしいCocoa】06_メモリ管理" title="【たのしいCocoa】06_メモリ管理" width="350" height="132" class="size-medium wp-image-7556" /></a><p class="wp-caption-text">【たのしいCocoa】06_メモリ管理</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h6>ガベージコレクションによるメモリ管理</h6>
<p><strong>■ ガベージコレクションとは</strong></p>
<p>メモリ上の使われなくなったオブジェクトをゴミとみなして、定期的にそれを回収。そしてメモリ領域を再利用できるようにするのがガベージコレクション。</p>
<p><strong>■ Objective-C とガベージコレクション</strong></p>
<p>Objective-C 2.0 から使用可能なので、Mac OS 10.5 移行じゃないと使えない。ガベージコレクションの仕組みとして、ゴミ回収するときは一旦アプリケーションの実行を停止しなくてはいけない。このゴミ回収は、結構時間がかかる、パフォーマンスを最重要視するアプリケーションの場合は、あえてガベージコレクションを使用せずに手動でメモリ管理をする場合もある。iPhone では、Objective-C は使えるが、ガベージコレクションは使えない。</p>
<p><strong>■ ガベージコレクションの有効化</strong></p>
<p>ガベージコレクションは、標準では無効化されている。有効化するには「プロジェクト > プロジェクト設定を編集」メニューを選択。ビルドタブを選択して、この中から「Objective-C Garbage Collection」という項目を選択。ポップアップメニューには、Unsupported、Supported、Required の3つがある。<strong>Supported</strong> は、主にプラグインを利用するためのアプリケーションのために用意されている項目。ガベージコレクションに対応していないプラグインでも読み込んで実行できるようにするためのもの。<strong>Required</strong> は全てのコードをガベージコレクション対応のものとして扱う。通常は Required を選択する。</p>
<div id="attachment_7557" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-27_01-02.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-27_01-02-350x132.jpg" alt="【たのしいCocoa】06_メモリ管理" title="【たのしいCocoa】06_メモリ管理" width="350" height="132" class="size-medium wp-image-7557" /></a><p class="wp-caption-text">【たのしいCocoa】06_メモリ管理</p></div>
<p><strong>■ ガベージコレクションプログラミングの定石</strong></p>
<p>ガベージコレクションの仕組みから、必要なオブジェクトはなんらかの形で参照しておくこと。参照されていないものはゴミとして回収されてしまう。逆に、いらなくなったオブジェクトは参照を解除する。そのためには変数に <strong>nil</strong> を設定する。</p>
<h6>参照カウンタによるメモリ管理</h6>
<p>ガベージコレクションを使わないメモリ管理。</p>
<p><strong>■ 参照カウンタ</strong></p>
<p>あるオブジェクトに対して、必要ならオブジェクトを参照する（<strong>refer</strong>）、または保持する（<strong>retain</strong>）。必要なくなったら参照をやめる（<strong>release</strong>）。</p>
<p><strong>■ retain、release メソッド</strong></p>
<p>以下は、ルートオブジェクトである NSObject のメソッド。全てのオブジェクトに対して呼び出せる。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> retain
このオブジェクトを参照する。参照カウンタを<span style="color: #2400d9;">1</span>上げる。返り値として自分自身を帰す。</pre></td></tr></table></div>

</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> release
このオブジェクトに対する参照をやめる。参照カウンタを<span style="color: #2400d9;">1</span>下げる。参照カウンタが<span style="color: #2400d9;">0</span>になると、このオブジェクトは開放される。</pre></td></tr></table></div>

</p>
<p>retain メソッドを呼ぶと、返り値としてそのオブジェクト自体が返ってくる。</p>
<p><strong>■ オブジェクトの確保から開放までの流れ</strong></p>
<ul>
<li>【1】AppController は、タイトルを表すオブジェクトをつくる。これによってメモリが確保される。このとき、文字列オブジェクトの参照カウンタは1。インスタンス化されたオブジェクトの初期値は1になる。</li>
<li>【2】AppController は、ボタンにタイトルを設定する。setTitle などのメソッドを使う。ボタンは、そのメソッドの中で、この文字列はまだ必要だと判断して、retain メソッドを呼び出す。これで、参照カウンタは1つ増えて2になる。ボタンでは、このオブジェクトを指し示すための変数をキープしておく必要がある。</li>
<li>【3】AppController からすると、このオブジェクトはもう必要ない。そこで、release メソッドを呼び出して参照をやめる。参照カウンタは1つ減り、1となる。これ以降、AppController 側では、文字列オブジェクトのための変数を捨ててしまっても構わない。</li>
<li>【4】ある程度処理が進んで、ユーザがウィンドウを閉じたとすると、その上にあるボタンも開放される。ボタンは開放されるときに自分が参照していた文字列オブジェクトに対して、もう必要なくなるので release メソッドを呼び出す。これで、参照カウンタが0になる。この時点で文字列オブジェクトは開放される。</li>
</ul>
<h6> クラスのインスタンス化</h6>
<p><strong>■ クラスのインスタンス化と初期化</strong></p>
<p>クラスのインスタンス化を行うメソッドは <strong>alloc</strong>。これを呼ぶことでインスタンス化、つまりオブジェクトのためのメモリ管理が行われる。alloc はクラスメソッドなので、インスタンス化したいクラス名を指定して、alloc を呼ぶことになる。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> alloc
クラスをインスタンス化する。返り値は、そのインスタンスオブジェクトになる。</pre></td></tr></table></div>

</p>
<p>alloc でインスタンス化したら、必ず初期化をする。初期化メソッドはクラスごとに用意されている。基本的な初期化メソッドは <strong>init</strong> で、NSObject が持っているメソッドで、特別なメソッドを呼ぶ必要がないときはこれを呼ぶ。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init
インスタンスを初期化する</pre></td></tr></table></div>

</p>
<p>インスタンス化の基本は <strong>alloc</strong> と <strong>init</strong> を続けて呼ぶこと。例えば MyObject というクラスがあったらインスタンス化はこんな感じになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">MyObject<span style="color: #002200;">*</span> object;
object <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MyObject alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>この、[クラス alloc] init] と重ねて呼ぶのが、インスタンス化の基本その1。こうやって初期化すると、参照カウンタは1になる。誰かが release を呼ばない限り開放されない。</p>
<p><strong>■ 自動開放</strong></p>
<p>自動開放を使うと、その処理が終わった後、適切な時点で release メソッドを呼んでくれる。自動開放を使うには、<strong>autorelease</strong> メソッドを呼ぶ。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> autorelease
インスタンスを自動開放するようにする。返り値として自分自身を返す。</pre></td></tr></table></div>

</p>
<p>先ほどの MyObject を、インスタンス化してさらに自動開放する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">MyObject<span style="color: #002200;">*</span> object;
object <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Myobject alloc<span style="color: #002200;">&#93;</span> inir<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>このように、[[[クラス名 alloc] init] autorelease] と3段重ねて呼ぶことになる。これがインスタンス化の基本その2。</p>
<p><strong>■ インスタンスを作成するメソッド</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stringWithCString<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> cString
　encoding<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span> encoding</pre></td></tr></table></div>

</p>
<p>これは引数としてCの文字列と、テキストエンコーディングを渡す。これを使って初期化したインスタンスを取得できる。そして、そのインスタンスはすでに自動開放されている。また、これと全く同じ引数をとる初期化メソッドも用意されている。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithCString<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> cString
　encoding<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>NSStringEncoding<span style="color: #002200;">&#41;</span> encoding</pre></td></tr></table></div>

</p>
<p>こちらは初期化メソッドなので、alloc の後に呼び出すことになる。つまり、次の2つのオブジェクトは全く同じものになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string0;
string0 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;new string&quot;</span>
　encoding<span style="color: #002200;">:</span>NSASCIIStringEncoding<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string1;
string1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;new string&quot;</span>
　encoding<span style="color: #002200;">:</span>NSASCIIStringEncoding<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>string0 はメソッドの呼び出し1回で自動開放されたインスタンスを作成している。それに対して string1 では3回メソッドを呼び出している。多くのクラスでは同じ引数を指定できる、自動開放されたインスタンスを作成するためのメソッドと、初期化を行うためのメソッドがある。用途に応じて便利な方を使う。</p>
<p><strong>■ インスタンスの開放</strong></p>
<p>参照カウンタが0になるとそのインスタンスは開放される。その開放される直前に呼び出されるメソッドが、<strong>dealloc</strong>。</p>
<p><strong>NSObject</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc
インスタンスが開放される直前に呼び出される。</pre></td></tr></table></div>

</p>
<p>サブクラスでこのメソッドを上書きすることで、開放されるときに必要な処理を行うことができる。もしクラスの中でなんらかのインスタンスを保持していたらここで必ず開放しないと、メモリリークが起きる。RSSリーダの AppController クラスには、次のように dealloc メソッドを実装していた。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc
<span style="color: #002200;">&#123;</span>
　<span style="color: #002200;">&#91;</span>document release<span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>ここでは document というインスタンス変数の release メソッドを呼び出している。このようにインスタンス変数を開放している。</p>
<p><strong>親クラスの dealloc の呼び出し</strong></p>
<p>dealloc ではその後に [super dealloc] という文が続く。<strong>super</strong> というのは、親クラスのメソッドを呼び出すためのキーワード。ここでは AppController の親クラス、NSObject のdealloc を呼び出している。dealloc メソッドを上書きした場合はかならずこの一文を書いておく必要がある。</p>
<h6>メモリ管理の定石</h6>
<p><strong>■ 一時的なオブジェクト</strong></p>
<p><strong>NSAutorelesePool</strong></p>
<p>時限付きゴミ袋のようなもの。自動開放を行うには、まず NSAutoreleasePool のインスタンスを作る。その状態で autorelease メソッドを呼び出すと、インスタンスが NSAutoreleasePool に登録される。最後に NSAutoreleasePool を開放すると、登録されているすべてのオブジェクトの release メソッドを呼び出す。こうやって自動的な開放を実現している。</p>
<p><strong>NSAutoreleasePool の作成と開放のタイミング</strong></p>
<p>Cocoa アプリケーションを立ち上げると、その内部で<strong>イベントループ</strong>と呼ばれるループが回ることになる。これはユーザからのキーボード入力やマウス操作を待ち受けるループ。このイベントループの内部なら、いつでも自動開放を使えるということになる。</p>
<p>ほとんどの処理は Interface Builder で登録したアクションをトリガーとして始まる。そしてアクションはイベントループから呼び出されて実行が始まり、終わるとループが一周する。ということは、アクション実行中は常に NSAutoreleasePool のインスタンスがある。そして、アクションメソッドが終わると、自動開放したオブジェクトは開放される。</p>
<p><strong>■ メモリ管理の定石のまとめ</strong></p>
<p><strong>オブジェクトを保持するか、一時的に使うだけか判断する</strong></p>
<p>そのメソッドの内部でしか使わないか、メソッドが終了した後でも何度も使うかの違い。</p>
<p><strong>保持するメソッドは、参照カウンタを上げる</strong></p>
<p>保持する必要があるオブジェクトに対しては、参照カウンタを1つ上げておく。他からもらったオブジェクトの場合は、retain メソッドを呼ぶ、自分でインスタンスを作成するときは alloc-init の組み合わせで作る。または、init&#8230; で始まる初期化メソッドを使う。</p>
<p><strong>一時的なオブジェクトは自動開放する</strong></p>
<p>インスタンスの作成を、alloc-init-autorelease の3段重ねで行う。または、それぞれのクラスに用意されている自動開放されたインスタンスを作成するためのメソッドを使う。</p>
<p><strong>dealloc ですべて参照カウンタを下げる</strong></p>
<p>保持しているオブジェクトは最後に開放しなくてはいけない。それを行うのが dealloc。dealloc メソッドを上書きして、保持しているインスタンス変数全ての release メソッドを呼び出す。あくまで、release メソッドを呼び出されて参照カウンタが0になったオブジェクトだけが開放される。</p>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-27-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】05_RSSリーダ</title>
		<link>http://www.head-t.com/2008/12/2008-12-22-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-22-01.html#comments</comments>
		<pubDate>Sun, 21 Dec 2008 16:10:08 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=139</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 チュートリアル：RSSリーダ プロジェクトの作成 【1】Xcode を起動する 【2】プロジェクトを作成する 「ファイ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7559" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-01-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7559" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>チュートリアル：RSSリーダ</h3>
<div id="attachment_7562" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-02.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-02-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7562" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<h4>プロジェクトの作成</h4>
<ul>
<li><strong>【1】Xcode を起動する</strong></li>
<li><strong>【2】プロジェクトを作成する</strong><br />
「ファイル &gt; 新規プロジェクト」メニューを選択して「Cocoa Application」テンプレートを選択。 </li>
<li><strong>【3】ガベージコレクションの設定</strong><br />
プロジェクトウィンドウのターゲットの項目を開いて、RSS Reader という名前の「ターゲット」をダブルクリック。このウィンドウで「ビルド」のタブをクリック。ビルドの設定を行う画面になるので、「構成」をすべての構成、「表示」を全ての設定にする。ここから「Objective-C Garbage Collection」という設定項目を探し、「Required」を指定する。 </li>
</ul>
<div id="attachment_7563" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-03.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-03-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7563" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<h4>クラスの作成</h4>
<p>このアプリケーションのための、AppController という名前のコントローラクラスを作る。</p>
<ul>
<li><strong>【4】クラスを作成する</strong><br />
「ファイル &gt; 新規ファイル」メニューを選択。テンプレート一覧から「Objective-C class」を選択。</li>
<li><strong>【5】AppController.h を開いて、次のように編集して保存。</strong>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span>
<span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
　<span style="color: #400080;">NSXMLDocument</span><span style="color: #002200;">*</span> document;
&nbsp;
　IBOutlet <span style="color: #400080;">NSTextField</span><span style="color: #002200;">*</span> urlTextField;
　IBOutlet <span style="color: #400080;">NSTextField</span><span style="color: #002200;">*</span> titleTextField;
　IBOutlet <span style="color: #400080;">NSTextField</span><span style="color: #002200;">*</span> linkTextField;
　IBOutlet <span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span> tableView;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>readURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
</li>
</ul>
<p>これで、コントローラとなるクラスを作成した。このクラスには5つのインスタンス変数があるが、これらのうと4つがアウトレット。また、メソッドは1つで、これはアクションになる。</p>
<h4>ユーザインタフェースデザイン</h4>
<p><strong>■ 部品の配置</strong></p>
<ul>
<li><strong>【6】xib ファイルを開く</strong><br />
ライブラリの「Cocoa &gt; View &amp; Cells」の下にある、「Inputs &amp; Values」からテキストフィールド、「Buttons」からボタンを、「Data Views」からテーブルビューをそれぞれ配置する。</li>
<li><strong>【7】ウィンドウ上に部品を配置していく。全部で8つ。</strong></li>
</ul>
<div id="attachment_7564" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-04.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-04-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7564" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<p><strong>■ テキストフィールドの設定</strong></p>
<p>左上の「URL:」「Title:」「Link:」のテキストフィールドの文字揃えを右揃えにする。</p>
<ul>
<li><strong>【8】テキストフィールドを設定する</strong><br />
インスペクタパネルの Attributes タブを選択し、Alignment: で右揃えにして調整を行う。 次に、編集可能なテキストフィールドを選択する。同じく Attributes タブの「Action」と書かれているポップアップメニューから「Set On Enter Only」を選択。これで、enter キーを押したときにだけアクションが送られるようになる。</li>
</ul>
<p><strong>■ テーブルビューの設定</strong></p>
<p>今回のアプリケーションでは、スッキリさせるために横スクロールバーを外すことにする。</p>
<ul>
<li><strong>【9】テーブルビューの設定をする</strong>
<p>追加したテーブルビューをクリックすると、いま選択しているものが何のクラスであるかがインスペクタのタイトルバーに表示される。スクロールビューが選択されている状態で、インスペクタの Attributes タブに「Show Horizontal Scroller」のチェックボックスを外す。続いて、この状態でもう一回クリックすると、タイトルが「Table View」になる。このように、インスペクタのタイトルを見ながら慎重にクリックする。</p>
<p>「Col. Sizing」というポップアップメニューがあるので、ここから「Uniform」を選択する。これで、テーブルビューの大きさを変更したときに、列のサイズも均等に変わることになる。</p>
<div id="attachment_7565" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-05.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-05-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7565" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<p>次はテーブルのヘッダの部分をクリックする。タイトルが「Table Header View」となる。さらにクリックして、テーブルのヘッダのみが白く強調され、他がグレーアウトになるようにする。この状態で列の大きさが調節できる。2つの列が同じ大きさになるように調整する。</p>
<div id="attachment_7566" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-06.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-06-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7566" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<p>列にタイトルも設定する。ヘッダをダブルクリックすることで、タイトルを設定することができる。左側には「Title」、右側には「Link」を入力する。</p>
<p>続いて、列の識別子も設定する。いったんテーブルビューの外側のウィンドウをクリックして選択を解除する。再びテーブルビューをクリックして「Table View」を選択した状態にする。この状態でテーブルビューの左側の領域をクリックすると、左側だけが強調表示されて、インスペクタのタイトルが「Table Column」となる。この状態でテーブルそれぞれの列の細かい設定を行うことができる。 インスペクタの「Identifier」で、Title 列は「title」、Link 列は「link」と入力する。そして、それぞれ「Editable」のチェックを外す。</p>
</li>
</ul>
<div id="attachment_7567" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-07.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-07-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7567" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<p><strong>■ 自動リサイズの設定</strong></p>
<p>自動リサイズは、部品ごとにインスペクタの Size タブで設定する。下半分にある「Autosizing」で設定を行う。</p>
<ul>
<li><strong>【10】自動リサイズの設定をする</strong><br />
まず URL テキストフィールドの設定を行う。「URL:」と書いてあるテキストフィールドを選択して、インスペクタの Size タブを表示する。このテキストフィールドは左上に固定する。<br />
同様に、全ての部品を設定していく。「Title:」「Link:」は左上固定。編集可能なテキストフィールド、「title」「link」のテキストフィールドは上に固定で横方向にはリサイズ。「Read」ボタンは右上固定。 テーブルビューはスクロールビューの中に入れられているので、リサイズの変更は外側のスクロールビューに対して行う。</li>
</ul>
<div id="attachment_7568" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-08.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-22_01-08-350x132.jpg" alt="【たのしいCocoa】05_RSSリーダ" title="【たのしいCocoa】05_RSSリーダ" width="350" height="132" class="size-medium wp-image-7568" /></a><p class="wp-caption-text">【たのしいCocoa】05_RSSリーダ</p></div>
<ul>
<li><strong>【11】リサイズのテストをする</strong><br />
「File &gt; Simulate Interface」メニューを選択すると、部品の動きをテストする。このモードから抜けるには「Cocoa Simulator &gt; Quit Cocoa Simulator」メニューを選択する。</li>
</ul>
<p><strong>■ ウィンドウの設定</strong></p>
<p>最後に、ウィンドウの設定をする。</p>
<ul>
<li><strong>【12】ウィンドウのタイトルを設定する</strong><br />
ウィンドウを選択して、インスペクタの Attributes タブを表示する。「Title」のテキストフィールドに「RSS Reader」と入力する。</li>
</ul>
<p>これでユーザインタフェースのデザインは完了。</p>
<h4>クラスのインスタンス化</h4>
<ul>
<li><strong>【13】クラスをインスタンス化する</strong><br />
ライブラリの「Cocoa &gt; Objects &amp; Controllers &gt; Controllers」にある Object を xib ウィンドウにドラッグして追加する。そのオブジェクトを追加したままインスペクタを追加し、Identity タブで「AppController」クラスを選択する。 </li>
</ul>
<h4>アウトレットとアクションの接続</h4>
<p><strong>■ AppController のアウトレットとアクション</strong></p>
<ul>
<li><strong>【14】アウトレットとアクションを接続する</strong> まずテキストフィールドのアウトレットを接続する。「urlTextfield」「titleTextField」「linkTextField」を、xib ウィンドウの AppController からコントロールキーを押しながらドラッグして、それぞれ接続する。テーブルビューも接続するが、注意して「NSTableView」というクラスを接続する。 アクションも接続する。「Read」ボタンからコントロールキーを押しながら AppController にドラッグして「readURL:」アクションに接続する。入力可能なテキストフィールドからも「readURL:」アクションに接続する。</li>
</ul>
<p><strong>■ テーブルビューのアウトレットの接続</strong></p>
<ul>
<li><strong>【15】テーブルビューのアウトレットを接続する</strong> アプリケーションのメインウィンドウでテーブルビューを何度かクリックして、スクロールビューではなくテーブルビューを選択した状態にする。その状態でコントロールキーを押しながら AppController にドロップする。そこで「dataSource」を選択する。</li>
</ul>
<h4>AppController クラスの実装</h4>
<ul>
<li><strong>【16】AppController.m を編集する</strong></li>
</ul>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AppController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> AppController
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>readURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
　<span style="color: #400080;">NSURL</span><span style="color: #002200;">*</span>  url;
　url <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>urlTextField stringValue<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
　<span style="color: #11740a; font-style: italic;">// XMLドキュメントを作成します</span>
　document <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSXMLDocument</span> alloc<span style="color: #002200;">&#93;</span> initWithContentsOfURL<span style="color: #002200;">:</span>url options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>document<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #a61390;">return</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// '/rss/channle/title'のノードを取得します</span>
　<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span>    nodes;
　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rss/channel/title&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/rdf:RDF/channel/title'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rdf:RDF/channel/title&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/feed/title'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/feed/title&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #400080;">NSXMLNode</span><span style="color: #002200;">*</span> titleNode;
　　titleNode <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nodes objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
　　<span style="color: #11740a; font-style: italic;">// テキストフィールドにタイトルを設定します</span>
　　<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span>   title;
　　title <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>titleNode stringValue<span style="color: #002200;">&#93;</span>;
　　<span style="color: #002200;">&#91;</span>titleTextField setStringValue<span style="color: #002200;">:</span>title<span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// '/rss/channle/link'のノードを取得します</span>
　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rss/channel/link&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/rdf:RDF/channel/link'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rdf:RDF/channel/link&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/feed/link'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/feed/link&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #400080;">NSXMLNode</span><span style="color: #002200;">*</span> linkNode;
　　linkNode <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nodes objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
　　<span style="color: #11740a; font-style: italic;">// テキストフィールドにリンクを設定します</span>
　　<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span>   link;
　　link <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>linkNode stringValue<span style="color: #002200;">&#93;</span>;
　　<span style="color: #002200;">&#91;</span>linkTextField setStringValue<span style="color: #002200;">:</span>link<span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// テーブルビューにデータを読み込みます</span>
　<span style="color: #002200;">&#91;</span>tableView reloadData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// NSTableViewデータソース</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>numberOfRowsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
<span style="color: #002200;">&#123;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>document<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #a61390;">return</span> <span style="color: #2400d9;">0</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// '/rss/channel/item/'のノードを取得します</span>
　<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span>    nodes;
　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rss/channel/item&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/rdf:RDF/item'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rdf:RDF/item&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/feed/entry'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/feed/entry&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// ノードの数を返します</span>
　<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// NSTableViewデータソース</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView objectValueForTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableColumn row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>row
<span style="color: #002200;">&#123;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>document<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// テーブルカラムの識別子を取得します</span>
　<span style="color: #a61390;">id</span>  identifier;
　identifier <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableColumn identifier<span style="color: #002200;">&#93;</span>;
&nbsp;
　<span style="color: #11740a; font-style: italic;">// '/rss/channel/item/'のノードを取得します</span>
　<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span>    nodes;
　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rss/channel/item&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/rdf:RDF/item'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/rdf:RDF/item&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// '/feed/entry'のノードを取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>document nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/feed/entry&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #11740a; font-style: italic;">// 指定された行の、ノードを取得します</span>
　<span style="color: #400080;">NSXMLNode</span><span style="color: #002200;">*</span>  node;
　node <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nodes objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
&nbsp;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>identifier isEqual<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;title&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// 'title'の文字列を取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>node nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;title&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　node <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nodes objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
　　<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>node stringValue<span style="color: #002200;">&#93;</span>;
　　<span style="color: #002200;">&#125;</span>
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>identifier isEqual<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;link&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　<span style="color: #11740a; font-style: italic;">// 'link'の文字列を取得します</span>
　　nodes <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>node nodesForXPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;link&quot;</span> error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
　　<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nodes count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
　　　node <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nodes objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
　　　<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>node stringValue<span style="color: #002200;">&#93;</span>;
　　<span style="color: #002200;">&#125;</span>
　<span style="color: #002200;">&#125;</span>
&nbsp;
　<span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span> <span style="color: #2400d9;">1</span></pre></td></tr></table></div>

</p>
<h4>ビルドと実行</h4>
<ul>
<li><strong>【17】ビルドと実行</strong><br />
「ビルド &gt; ビルドと実行」メニューを選択。</li>
</ul>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-22-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】04_Objective-Cの文法</title>
		<link>http://www.head-t.com/2008/12/2008-12-21-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-21-01.html#comments</comments>
		<pubDate>Sat, 20 Dec 2008 16:36:03 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=138</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 チュートリアル: 文法の実験のためのプロジェクト Objective-C の実験のためのプロジェクト作成 Xpre l [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7569" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-21_01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-21_01-350x132.jpg" alt="【たのしいCocoa】04_Objective-Cの文法" title="【たのしいCocoa】04_Objective-Cの文法" width="350" height="132" class="size-medium wp-image-7569" /></a><p class="wp-caption-text">【たのしいCocoa】04_Objective-Cの文法</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkpre lang="objc" line="1"=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>チュートリアル: 文法の実験のためのプロジェクト</h3>
<h4>Objective-C の実験のためのプロジェクト作成</h4>
<ol>
<li><strong>Xpre lang=&#8221;objc&#8221; line=&#8221;1&#8243; を起動する</strong></li>
<li><strong>プロジェクト作成する</strong> 「ファイル > 新規プロジェクト」メニューを選択。Command Line Utility カテゴリの下にある<br />
  Foundation Tool を選択。登録されているファイルの .m の拡張子の付いたファイルが Objective-C のコードを書くためのもの。</li>
<li><strong>クラスを作成する</strong> 「ファイル > 新規ファイル」メニューを選択し、Cocoa カテゴリの下にある Objective-C class を選択。ここでのファイル名が、新規クラス名になる。.h も同時に作成しておく。 ※以前 AppController というクラスを作ったのと同様の手順になる。</li>
<li><strong>MyObject.h を編集する</strong>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span>
      <span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
      <span style="color: #a61390;">int</span>	count;
      <span style="color: #002200;">&#125;</span>
      <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> count;
      <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCount<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>cnt;
      <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
</li>
<li><strong>MyObject.m を編集する</strong>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MyObject.h&quot;</span>
      <span style="color: #a61390;">@implementation</span> MyObject
      <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> count
      <span style="color: #002200;">&#123;</span>
      　<span style="color: #a61390;">return</span> count;
      <span style="color: #002200;">&#125;</span>
      <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCount<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>cnt
      <span style="color: #002200;">&#123;</span>
      　count <span style="color: #002200;">=</span> cnt;
      <span style="color: #002200;">&#125;</span>
      <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
</li>
<li><strong>ObjCTest.m を編集する</strong> ここまでで作った Myobject クラスをインスタンス化して、メソッドを呼び出してみるため、ObjCTest.m を以下のように編集する。
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;foundation/Foundation.h&gt;</span>
      <span style="color: #6e371a;">#import &quot;MyObject.h&quot;</span>
&nbsp;
      <span style="color: #a61390;">int</span> main <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> argc, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> argv<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
      　<span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span> pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
      　MyObject<span style="color: #002200;">*</span> object <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MyObject alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
      　<span style="color: #002200;">&#91;</span>object setCount<span style="color: #002200;">:</span><span style="color: #2400d9;">5</span><span style="color: #002200;">&#93;</span>;
&nbsp;
      　<span style="color: #a61390;">int</span> count;
      　count <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>object count<span style="color: #002200;">&#93;</span>;
      　NSLog <span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;count is %d&quot;</span>, count<span style="color: #002200;">&#41;</span>;
&nbsp;
      　<span style="color: #002200;">&#91;</span>object release<span style="color: #002200;">&#93;</span>;
      　<span style="color: #002200;">&#91;</span>pool release<span style="color: #002200;">&#93;</span>;
      　<span style="color: #a61390;">return</span> <span style="color: #2400d9;">0</span>;
      <span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
</li>
<li><strong>ビルドと実行をする</strong> 「ビルド > ビルドと実行」メニューを選択する。次のような結果が表示される。

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #002200;">&#91;</span>Session started at <span style="color: #2400d9;">2008</span><span style="color: #002200;">-</span>00<span style="color: #002200;">-</span>00 00<span style="color: #002200;">:</span>00<span style="color: #002200;">:</span>00 <span style="color: #002200;">+</span>0900.<span style="color: #002200;">&#93;</span>
      <span style="color: #2400d9;">2008</span><span style="color: #002200;">-</span>00<span style="color: #002200;">-</span>00 00<span style="color: #002200;">:</span>00<span style="color: #002200;">:</span><span style="color: #2400d9;">00.000</span> ObjC Test<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">2767</span><span style="color: #002200;">:</span>10b<span style="color: #002200;">&#93;</span> count is <span style="color: #2400d9;">5</span>
    The Debugger has exited with status <span style="color: #2400d9;">0</span>.</pre></td></tr></table></div>

</li>
</ol>
<h3>Objective-Cの文法</h3>
<h4>Objective-Cの書き方</h4>
<p><strong>■ クラスの宣言と実装 </strong></p>
<p>クラスの宣言ファイルには <strong>.h</strong> という拡張子（header の意味）を付ける。クラスの実装には <strong>.m</strong> の拡張子（method の意味）を付ける。</p>
<h4>クラスの宣言</h4>
<p><strong>フレームワークのクラス宣言の読み込み</strong></p>
<p><strong>#import</strong> という文を使ってクラスの宣言を読み込む。例えば Cocoa のすべてのクラス宣言を読み込む場合は次のように書く。これは、「システムにある Cocoa フレームワークの Cocoa.h ファイルを読み込む」という意味になる。<strong><></strong> はシステムのヘッダファイルを意味する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span></pre></td></tr></table></div>

</p>
<p><strong>自分で作ったクラス宣言の読み込み</strong></p>
<p>自分で作ったクラスの宣言ファイルを読み込む場合は次のように書く。<strong>&#8220;&#8221;</strong> はヘッダファイルがプロジェクトの内部にあることを示している。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AppController.h&quot;</span></pre></td></tr></table></div>

</p>
<p><strong>クラス宣言の先頭には #import</strong></p>
<p>クラス宣言を書く時は、先頭に </p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span></pre></td></tr></table></div>

</p>
<p>と書いておき、必要なものがあればそれも読み込んでおく。</p>
<p><strong>■ クラスの宣言</strong></p>
<p>クラスの名前を、たとえば MyObject とする。親クラスも決めておく。何かのクラスを拡張するときはそのクラスを、特にないときは Cocoa のルートクラスである <strong>NSObject</strong> を使う。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>まず、これからクラス宣言をするという意味の <strong>@interface</strong> を書く。その次にクラス名、そしてコロンで区切って親クラス名を書く。クラスの宣言は <strong>@end</strong> で終わる。</p>
<p><strong>■ インスタンス変数の宣言</strong></p>
<p>クラスの宣言にインスタンス変数の宣言を加えることができる。例えば先ほどの MyObject に count と index という変数を加えてみる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  <span style="color: #002200;">&#123;</span>
  　<span style="color: #a61390;">int</span> count;
  　<span style="color: #a61390;">int</span> index;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>@interface と @end の間に <strong>{}</strong> を付け加えて、その中に書く。</p>
<p><strong>■ メソッドの宣言</strong></p>
<p><strong>引数なしのインスタンスメソッドの場合</strong></p>
<p>例えばインスタンス変数である count の値を取得するためのメソッドを、count という名前で宣言する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  <span style="color: #002200;">&#123;</span>
  　<span style="color: #a61390;">int</span> count;
  　<span style="color: #a61390;">int</span> index;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count;
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>まず先頭に <strong>-（マイナス）</strong>が来る。空白を挟んでカッコの中に返り値の型を書く。そしてメソッドの名前を書く。</p>
<p><strong>引数1つのインスタンスメソッドの場合</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> NSObjext
  ...
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count;
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setCount<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count;
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p><strong> &#8211; (void)setCount:(int)count; </strong>というメソッドが、引数を1つ取るもの。返り値とメソッド名までは引数なしのものと同じ。その後が引数のためのものとなる。まず、<strong>:</strong>（コロン）が来る。そして、カッコの中に引数の型。次に引数の名前を書く。</p>
<p><strong>引数2つ以上のインスタンスメソッドの場合</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  ...
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count;
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setCount<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count;
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setCount<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count andIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>index;
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>1つめの引数までは前と同じ。そしてその後にまず空白がある。そして、<strong>ラベル</strong>と呼ばれるものが来る。上記の例だと <strong>andIndex</strong> がラベルになる。次にコロン、カッコして引数型、引数名と続く。ラベルはメソッド名の一部で、メソッドの正式な名前はメソッドとラベルをあわせたものになる。それらはコロンでつなぐ。上記のメソッドは「setCount:andIndex:」という名前になる（最後のコロンも含む）。コロンの後には引数が来る。だから引数の数とコロンの数は等しくなる。引数の数がさらに増えると、「ラベル:（引数型）引数名」の組が、後に増えていくことになる。</p>
<p><strong>例）Cocoaのメソッド</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithBitmapDataPlanes<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span><span style="color: #002200;">**</span><span style="color: #002200;">&#41;</span>planes
  　pixelsWide<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>width
  　pixelsHigh<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>height
  　bitsPerSample<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>bps
  　samplesPerPixel<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>spp
  　hasAlpha<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>alpha
  　isPlanar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>isPlanar
  　colorSpaceName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>colorSpaceName
  　bytePerRow<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>rowBytes
  　bitsPerPixel<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>pixelBits;</pre></td></tr></table></div>

</p>
<p>まずコロンの数を確認する。10個あるので、10個の引数があるということになる。それぞれのコロンの前にあるのがラベル。これが引数の説明になる。後にあるのが引数の型と名前。</p>
<p><strong>クラスメソッドの場合</strong></p>
<p>メソッドにはクラスメソッドもある。インスタンスメソッドの宣言は、常に <strong>-</strong>（マイナス）で始まっていたが、クラスメソッドは <strong>+</strong>（プラス）になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  ...
  <span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>maxIndexValue;
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<h4>クラスの実装</h4>
<p>クラス宣言は <strong>.h</strong> に書いたが、クラスの実装は <strong>.m</strong> に書く。</p>
<p><strong>■ クラスの実装</strong></p>
<p>まずは先ほど作ったクラスの宣言を読み込んでおく。そして、クラスの実装には <strong>@implementation</strong> を使う。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MyObject.h&quot;</span>
  <span style="color: #a61390;">@implementation</span> MyObject
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p><strong>■ メソッドの実装</strong></p>
<p>例として、MyObject に count メソッドの実装を付け加えてみる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MyObject.h&quot;</span>
  <span style="color: #a61390;">@implementation</span> MyObject
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>count
  <span style="color: #002200;">&#123;</span>
  　<span style="color: #a61390;">return</span> count;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>メソッドの実装は、<strong>@implementation</strong> と <strong>@end</strong> の間に書いていく。まず宣言と同じ形でメソッドを書く。その後に <strong>{}</strong> を書く。その中にメソッドの処理を実装していく。</p>
<p><strong>■ メソッドの宣言は常に必要か？</strong></p>
<p>メソッドの宣言なしにいきなり実装しても構わない。他のクラスから呼んでもらう必要のないものに関しては、メソッドの宣言は .h ファイルに加えなくてもいい。</p>
<h4>オブジェクトのための変数型</h4>
<p><strong>■ インスタンスオブジェクトのため変数型</strong></p>
<p>このような値のための変数は、<strong>クラス名のポインタ</strong>という形式の型になる。たとえば先ほどの MyObject クラスのインスタンスのための変数は次のようになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">MyObject<span style="color: #002200;">*</span> object;</pre></td></tr></table></div>

</p>
<p>Cocoa のクラスである NSString のための変数は次のようになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;</pre></td></tr></table></div>

</p>
<p><strong>■ id 型</strong></p>
<p>id 型は、全てのオブジェクトのために使える型。Cocoa の全てのクラスは NSObject から継承されているが、この NSObject には、Objective-C の全てのオブジェクトに共通するデータが含まれている。これを表すための変数型が id 型。すべてのオブジェクトは id 型の変数に代入することができる。でもそれだと、その変数がいったい何のクラスだったのか分かりにくいので、それを避けたいときはクラス名のポインタ型を使うことになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">IBOutlet <span style="color: #a61390;">id</span> textField;</pre></td></tr></table></div>

</p>
<p>では id 型が使われていたが、これを</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">IBOutlet <span style="color: #400080;">NSTextField</span><span style="color: #002200;">*</span> textField;</pre></td></tr></table></div>

</p>
<p>と書くこともできる。こうすると何のクラスなのか分かりやすくなる。</p>
<p><strong>■ nil 型</strong></p>
<p>C言語では NULL という値があったが、Objective-C にも似たようなものがる。オブジェクトのための変数が、何のオブジェクトも指し示していないことを表す変数、<strong>nil</strong> という値。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;
  <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;</pre></td></tr></table></div>

</p>
<p>これで、この string という変数は何も指し示していないということが保証される。</p>
<p><strong>■ オブジェクトの変数と条件式</strong></p>
<p>条件式は、if 文などで条件を判断するときに使う式。無効なオブジェクトを表す <strong>nil</strong> は、実際は <strong>0</strong> の値で、<strong>string = nil; </strong>という文は、<strong>string</strong> に <strong>0</strong> という値を代入している。これを利用すれば、あるオブジェクトの変数が有効なのか無効なのか判断するには、次のようにかけばいいということになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;
  <span style="color: #11740a; font-style: italic;">//string オブジェクトを、どこからか取得する</span>
  ...
  <span style="color: #11740a; font-style: italic;">//string オブジェクトが有効かどうか判断する</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">string</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
  　<span style="color: #11740a; font-style: italic;">//string オブジェクトが有効</span>
  <span style="color: #002200;">&#125;</span>
  <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
  　<span style="color: #11740a; font-style: italic;">//string オブジェクトは無効</span>
  <span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<h4>メソッドの呼び出し</h4>
<p><strong>■ インスタンスメソッドの呼び出し</strong></p>
<p>先ほど、MyObject クラスに count というメソッドを実装したが、それを呼び出してみる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">MyObject<span style="color: #002200;">*</span> object;
  <span style="color: #11740a; font-style: italic;">//MyObject をインスタンス化する</span>
  ...
  <span style="color: #11740a; font-style: italic;">//count メソッドを呼び出す</span>
  <span style="color: #a61390;">int</span> count;
  count <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>object count<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>まず、返り値がある。メソッドは関数と同じように返り値を返す。そして <strong>[]</strong> がある。その中に、まずインスタンスオブジェクト。空白を開けてメソッド名を書く。</p>
<p>引数が1つの setCount; 、引数が2つの setCount:andIndex を呼び出す場合は次のようになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>object setCount<span style="color: #002200;">:</span><span style="color: #2400d9;">5</span><span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#91;</span>object setCount<span style="color: #002200;">:</span><span style="color: #2400d9;">12</span> andIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">6</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>引数1つの場合はメソッド名の後に引数を、2つの場合はメソッド名とラベルの後にそれぞれ引数を書く。コロンの前にあるのが引数の説明、後にあるのが引数の値。</p>
<p><strong>■ クラスメソッドの呼び出し</strong></p>
<p>文法自体はインスタンスメソッドのものと変わらない。違いは、呼び出しの対象となるオブジェクト。クラスメソッドは、特定のインスタンスに対してではなく、クラス全体に対して呼び出す。なので呼び出す対象のところにクラス名を指定する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">int</span> maxIndex;
 maxIndex <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>MyObject maxIndexValue<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p><strong>■ オブジェクトが nil の場合</strong></p>
<p>インスタンスメソッドの呼び出しのとき、インスタンスのオブジェクトのための変数を使っていたが、これが普通にインスタンス化されたオブジェクトを指していれば問題ないが、ここに <strong>nil</strong> が入っているとどうなるか。<strong>nil</strong> に対してメソッドを呼び出すと、その呼び出しは単に無視される。返り値としては、型にかかわらず 0 が返ってくる。変数に <strong>nil</strong> が入っていると、クラッシュも何も起きない。</p>
<h4>命名規則</h4>
<p><strong>■ クラスの命名規則</strong></p>
<p><strong>最初の文字は大文字</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">MyObject
<span style="color: #400080;">NSString</span>
WebView</pre></td></tr></table></div>

</p>
<p><strong>プロジェクトで共通の頭文字</strong></p>
<p>例えば、Cocoa に登場するクラスはすべて <strong>NS</strong> で始まっている。Web Kit の場合は <strong>Web</strong> で始まっている。このように、2文字から4文字程度の共通する文字で始める。こうやっておくと、他のプロジェクトのクラスと名前がかぶらないという利点もある。</p>
<p><strong>■ インスタンス変数の命名規則</strong></p>
<p><strong>最初の文字は小文字</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">index
count
description</pre></td></tr></table></div>

</p>
<p><strong>アンダースコアで始めるときは注意</strong></p>
<p>インスタンス変数とメソッドの内部で宣言した変数とを区別するために、インスタンス変数を <strong>_</strong>（アンダースコア）で始めるというルールがある。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">_index
_count</pre></td></tr></table></div>

</p>
<p>ただし、Cocoa のクラスが宣言しているインスタンス変数もアンダースコアで始まっているので、自分で宣言した変数が Cocoa のものとかぶってしまう可能性がある。</p>
<h4>メソッドの命名規則</h4>
<p><strong>最初の文字は小文字</strong></p>
<p>最初の文字は小文字にする。単語をつなぐときは、アンダースコアではなく、単語の頭を大文字にする。</p>
<p><strong>取得と設定のためのメソッド</strong></p>
<p>値を設定するメソッドの名前は、設定する属性の名前の前に <strong>set</strong> を付ける。例えば count を設定するためのメソッドは setCount、index を設定するためのメソッドは setIndex 。 それに対して取得の方は、属性の名前がそのままメソッド名になる。count を値を取得するメソッドは count、index は index 。get は付けないのが Cocoa スタイル。</p>
<p><strong>英文として読める</strong></p>
<p>Cocoa のメソッド名が長いのは、メソッドとラベルをつなげると英文として読み取れるようにしているため。読めるメソッド名を使うのが Cocoa の特徴。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">initWithFormat<span style="color: #002200;">:</span>
（指定した）フォーマットを使って初期化する
&nbsp;
stringByAppendingFormat<span style="color: #002200;">:</span>
（指定した）フォーマットを追加した文字列（を取得する）
&nbsp;
canBeConvertedEncoding<span style="color: #002200;">:</span>
（指定した）エンコーディングに変換できるか？</pre></td></tr></table></div>

</p>
<h4>Hello World を読み直す</h4>
<p><strong>■ AppController.h</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/* AppController */</span>
  <span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span>
  <span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
  <span style="color: #002200;">&#123;</span>
  　IBOutlet <span style="color: #a61390;">id</span> textField;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/* AppController */</span></pre></td></tr></table></div>

</p>
<p>コメント文。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #6e371a;">#import &lt;cocoa/Cocoa.h&gt;</span></pre></td></tr></table></div>

</p>
<p>#import を使って Cocoa クラスの宣言を読み込んでいる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#123;</span></pre></td></tr></table></div>

</p>
<p>AppCntroller クラスのための、インスタンス変数の宣言の始まりを表す中カッコ。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"> IBOutlet <span style="color: #a61390;">id</span> textField;</pre></td></tr></table></div>

</p>
<p>AppController クラスのためのインスタンス変数。IBOutlet という宣言は、この変数が Interface Builder で追加されたアウトレットであることを示している。次に来るのは変数の型。この変数の型は id 型ということになる。最後に来るのは変数の名前、textField 。これは Interface Builder で付けた名前だが、クラスのインスタンス変数となるので、名前付けの規則に従うようにする。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>インスタンス変数の宣言の終わりを表す中カッコ。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;</pre></td></tr></table></div>

</p>
<p>AppController クラスのメソッド宣言。<strong>-</strong> で始まっているので、インスタンスメソッド。メソッドの返り値の型は IBAction になっている。これは、このメソッドが Interface Builder で追加されたアクションであるということを意味している。続いて sayHello: というメソッドの名前が来る。コロンが1つあるので、引数が1つあるということが分かる。最後に引数。引数の型は id 型、引数の名前は sender 。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>AppController クラスの宣言の、終わりを表している。</p>
<p><strong>■ AppController.m</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AppController.h&quot;</span>
  <span style="color: #a61390;">@implementation</span> AppController
  <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
  <span style="color: #002200;">&#123;</span>
  　<span style="color: #002200;">&#91;</span>textField setStringValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello World!&quot;</span><span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AppController.h&quot;</span></pre></td></tr></table></div>

</p>
<p>まず #import 文。AppController.h ファイル、つまり AppController クラスのための宣言を読み込んでいる。こちらのファイルでは Cocoa の宣言を読み込んでいないが、AppController.h のほうで読み込んでいるので問題ない。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> AppController</pre></td></tr></table></div>

</p>
<p>AppController クラスの実装の開始を表している。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender</pre></td></tr></table></div>

</p>
<p>メソッドの実装を表している。sayHello: メソッドの実装になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#123;</span></pre></td></tr></table></div>

</p>
<p>メソッドの実装の開始を表す中カッコ。メソッドの実装は、この中カッコの内部に書く。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>textField setStringValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello World!&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

</p>
<p>ここからが sayHello: メソッドの中身になる。<strong>[]</strong> で括られているが、これがメソッドの読み出し。textField オブジェクトのメソッドを呼び出している。Interface Builder で追加したテキストフィールドと、textField とが接続したため、NSTextField というクラスのオブジェクトになる。 setStringValue メソッドは、引数を1つとる。これは、テキストフィールドに設定するための文字列。これに @&#8221;Hello World&#8221; を指定する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>メソッドの実装の終わりを表す中カッコ。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>AppController クラスの実装の終わりを表す。</p>
<div class="link">
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkpre lang="objc" line="1"=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-21-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】03_C言語の文法</title>
		<link>http://www.head-t.com/2008/12/2008-12-16-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-16-01.html#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:42:26 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=134</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 チュートリアル: 文法の実験のためのプロジェクト C言語の実験のためのプロジェクト作成 Xcode を起動する プロジ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7577" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-16_01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-16_01-350x132.jpg" alt="【たのしいCocoa】03_C言語の文法" title="【たのしいCocoa】03_C言語の文法" width="350" height="132" class="size-medium wp-image-7577" /></a><p class="wp-caption-text">【たのしいCocoa】03_C言語の文法</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>チュートリアル: 文法の実験のためのプロジェクト</h3>
<h4>C言語の実験のためのプロジェクト作成</h4>
<ol>
<li><strong>Xcode を起動する</strong></li>
<li><strong>プロジェクトを作成する</strong> 「ファイル > 新規プロジェクト」メニューを選択。Command Line Utility カテゴリの下にある、Standard Tool を選択。できあがったプロジェクトの main.c というファイルがC言語を書くためのファイル。</li>
<li><strong>main.c を編集する</strong> 次のようなコードを追加する。バックスラッシュはオプション＋¥で入力できる。
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// insert code here...</span>
<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;i is %dn&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
</li>
<li><strong>ビルドと実行をする</strong> 「ビルド > ビルドと実行」メニューを選択する。次のような結果が表示される。 ※実行結果のウィンドウは「実行 > コンソール」で表示。
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>Session started at <span style="color: #0000dd;">2008</span><span style="color: #339933;">-</span><span style="color: #208080;">00</span><span style="color: #339933;">-</span><span style="color: #208080;">00</span> <span style="color: #208080;">00</span><span style="color: #339933;">:</span><span style="color: #208080;">00</span><span style="color: #339933;">:</span><span style="color: #208080;">00</span> <span style="color: #339933;">+</span><span style="color:#800080;">0900.</span><span style="color: #009900;">&#93;</span>
i is <span style="color: #0000dd;">0</span>
i is <span style="color: #0000dd;">1</span>
i is <span style="color: #0000dd;">2</span>
i is <span style="color: #0000dd;">3</span>
i is <span style="color: #0000dd;">4</span>
The Debugger has exited with status <span style="color: #0000dd;">0</span>.</pre></td></tr></table></div>

</p>
</li>
</ol>
<h3>C言語の文法</h3>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// insert code here...</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>int main&#8230; と return 0; の間にソースコードを書いていく。</p>
<p><strong>■ コメント</strong></p>
<p>// か /*&#8230;*/ でコメントアウト。</p>
<h4>変数</h4>
<p><strong>■ 変数の型</strong></p>
<table>
<tr>
<th>型</th>
<th>意味</th>
</tr>
<tr>
<td>char</td>
<td>文字</td>
</tr>
<tr>
<td>int</td>
<td>整数</td>
</tr>
<tr>
<td>float</td>
<td>小数</td>
</tr>
<tr>
<td>double</td>
<td>小数</td>
</tr>
</table>
<p>この型につけることでその意味を少し格調する装飾子。装飾子は主に整数型である int につけることになる。</p>
<table>
<tr>
<th>装飾子</th>
<th>意味</th>
</tr>
<tr>
<td>signed</td>
<td>符号あり</td>
</tr>
<tr>
<td>unsigned</td>
<td>符号なし</td>
</tr>
<tr>
<td>short</td>
<td>短い</td>
</tr>
<tr>
<td>long</td>
<td>長い</td>
</tr>
</table>
<p><strong>■ 文字</strong></p>
<p>文字を表す型は <strong>char</strong> 型。英語のみで、日本語は含まれない。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> c <span style="color: #339933;">=</span> <span style="color: #ff0000;">'a'</span>
<span style="color: #993333;">char</span> letter <span style="color: #339933;">=</span> <span style="color: #ff0000;">'L'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>このように、シングルクォーテーションで文字を代入することができる。</p>
<p><strong>■ 整数</strong></p>
<p>整数のための変数の型が <strong>int</strong> 型。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p><strong>■ 小数</strong></p>
<p><strong>float</strong> と <strong>double</strong> が、小数のための変数型。float は32ビット、double は64ビット。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">float</span> f <span style="color: #339933;">=</span> <span style="color:#800080;">12.2f</span><span style="color: #339933;">;</span>
<span style="color: #993333;">double</span> value <span style="color: #339933;">=</span> <span style="color:#800080;">1.0</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>小数点を使うと小数になり、数字の終わりに <strong>f</strong> をつけると float 型になる。ない場合が double 型。</p>
<p><strong>■ 変数の名前</strong></p>
<p>アルファベット（大文字小文字は区別される）、数字、アンダースコア。名前を数字で始めることはできない。アルファベットがアンダースコアにする。</p>
<p><strong>■ 名前付けのルール</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//単一の単語の場合</span>
<span style="color: #993333;">int</span> name<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//先頭はアルファベットの小文字にする</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//複数の単語の場合</span>
<span style="color: #993333;">int</span> childName<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//2つめ以降の先頭は大文字にするパターン</span>
<span style="color: #993333;">int</span> parent_name<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//アンダースコアでつなぐパターン</span></pre></td></tr></table></div>

</p>
<h4>配列とポインタ</h4>
<p><strong>■ 配列</strong></p>
<p>変数の名前の後に <strong>[]</strong> で確保する値の数を書く。たとえば12個の整数の値が欲しい場合は次のように書く。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> ages<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>それぞれの変数にアクセスするときは、同じように [] をつけてインデックスを指定する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//最初の変数に値を設定</span>
ages<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">24</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//値を取り出す</span>
<span style="color: #993333;">int</span> firstAge <span style="color: #339933;">=</span> ages<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>インデックスは0から始めることに注意。</p>
<p><strong>■ ポインタ</strong></p>
<p>ポインタを理解するには、それが最終的にコンピュータのメモリ上に配置されて、CPUに読み取られて、実行されるところを想像しないといけない。</p>
<p><strong>■ ポインタの文法</strong></p>
<p>メモリ上にあるひとまとまりのデータを指し示すために、<strong>ポインタ変数</strong>と呼ばれる変数を使う。ポインタ変数は、変数型の後（もしくは変数名の前）にアスタリスクを付けることで宣言する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span><span style="color: #339933;">*</span> c0<span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>c1<span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>■ <strong>C言語の文字列</strong></p>
<p>文字列を作るためには、<strong>&#8220;&#8221;</strong> で囲んで記述する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span><span style="color: #339933;">*</span> osName <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;MacOSX&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>文字列は char の配列で、配列はひとまとまりのデータなので、配列はポインタで受け取ることができる。</p>
<p><strong>■ NULL値:文字列の終端文字</strong></p>
<p>先ほどの例で、&#8221;MacOSX&#8221; という文字列を作ったが、その文字列は次のようになっている。</p>
<p><strong>M　a　c　O　S　X　NULL</strong></p>
<p>文字は6文字だけど配列は7文字分確保されている。そして最後のもじは NULL と呼ばれる特殊な文字になっている。これを <strong>NULL 終端文字</strong>と呼ぶ。NULL は何でもないものやどこでもないところを指す。C言語の文字列では常に NULL が最後にくるので、文字列の大きさは先頭から NULL までの長さを調べればいい。</p>
<h4>printf</h4>
<p><strong>■ 文字列の出力</strong></p>
<p>指定した文字列を出力することができる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Mac OS Xn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p><strong>■ バックスラッシュ</strong></p>
<table>
<tr>
<td>n</td>
<td>改行</td>
</tr>
<tr>
<td>r</td>
<td>復帰（キャリッジリターン）</td>
</tr>
<tr>
<td>t</td>
<td>タブ</td>
</tr>
<tr>
<td>&#8220;</td>
<td>ダブルクォーテーション</td>
</tr>
<tr>
<td></td>
<td>バックスラッシュそのもの</td>
</tr>
</table>
<p><strong>■ 変数の出力</strong></p>
<p>printf を使って、変数の値を出力することもできる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> count <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;count is %d.n&quot;</span><span style="color: #339933;">,</span> count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>実行結果</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">count is <span style="color: #0000dd;">5</span>.</pre></td></tr></table></div>

</p>
<p>%d のところが count の値と置き換わっている。これを置換子と呼ぶ。整数のための置換子は %d だが、他の変数のための置換子もある。文字は <strong>%c</strong>、小数は<strong> %f</strong>、文字列は <strong>%s</strong>。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//文字のための置換子</span>
<span style="color: #993333;">char</span> letter <span style="color: #339933;">=</span> <span style="color: #ff0000;">'a'</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;letter is %c.n&quot;</span><span style="color: #339933;">,</span> letter<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//小数の置換子</span>
<span style="color: #993333;">float</span> value <span style="color: #339933;">=</span> <span style="color:#800080;">12.5f</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;value is %f.n&quot;</span><span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//文字列のための置換子</span>
<span style="color: #993333;">char</span><span style="color: #339933;">*</span> string <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Cocoa&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello %s!n&quot;</span><span style="color: #339933;">,</span> string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>実行結果</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">letter is a.
<span style="color: #202020;">value</span> is <span style="color:#800080;">12.500000</span><span style="color: #339933;">;</span>
Hello Cocoa<span style="color: #339933;">!</span></pre></td></tr></table></div>

</p>
<h4>演算子</h4>
<p><strong>■ 算術演算子</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">int</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">;</span>
a<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
b<span style="color: #339933;">=</span><span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>
c<span style="color: #339933;">=</span>a<span style="color: #339933;">+</span>b<span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//cは15になる</span>
&nbsp;
<span style="color: #993333;">int</span> d<span style="color: #339933;">;</span>
d<span style="color: #339933;">=</span>c<span style="color: #339933;">-</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//dは7になる</span>
&nbsp;
<span style="color: #993333;">int</span> e<span style="color: #339933;">;</span>
e<span style="color: #339933;">=</span>d<span style="color: #339933;">*</span><span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//eは28になる</span></pre></td></tr></table></div>

</p>
<p>整数型同士の割り算の答えは整数になり、余りは無視される。小数型の割り算の答えは小数になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">int</span> f<span style="color: #339933;">,</span>g<span style="color: #339933;">,</span>h<span style="color: #339933;">;</span>
f<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
g<span style="color: #339933;">=</span><span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
h<span style="color: #339933;">=</span>f<span style="color: #339933;">/</span>g<span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span>h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//hは3になる</span></pre></td></tr></table></div>

</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">double</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>k<span style="color: #339933;">;</span>
i<span style="color: #339933;">=</span><span style="color:#800080;">10.0</span><span style="color: #339933;">;</span>
j<span style="color: #339933;">=</span><span style="color:#800080;">3.0</span><span style="color: #339933;">;</span>
k<span style="color: #339933;">=</span>i<span style="color: #339933;">/</span>j<span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%fn&quot;</span><span style="color: #339933;">,</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//kは3.333333になる</span></pre></td></tr></table></div>

</p>
<p>割り算の余りを求めるものもあり、<strong>剰余演算子</strong>、<strong>モジュロ演算子</strong>と呼ぶ。記号は<strong>%</strong>を使う。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> l<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #339933;">;</span>
l <span style="color: #339933;">=</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>
m <span style="color: #339933;">=</span> l<span style="color: #339933;">/</span><span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//mは、100を3で割った数なので、33になる</span>
n <span style="color: #339933;">=</span> l<span style="color: #339933;">%</span><span style="color:#800080;">3</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//nは、100を3で割ったときの余りなので、1になる</span></pre></td></tr></table></div>

</p>
<p>計算式を書くときに省略するスタイルもある。<strong>+=</strong> というように、演算子と等号記号をつなげて書くと、その変数自身に数値を加えるという意味になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">i <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//i=i+1;と同じ</span>
j <span style="color: #339933;">-=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//j=j-2;と同じ</span></pre></td></tr></table></div>

</p>
<p><strong>++</strong> と書くと、1増やすという意味になる、<strong>&#8211;</strong> も使える。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">i<span style="color: #339933;">++;</span> <span style="color: #666666; font-style: italic;">//i+=1;と同じ</span>
i<span style="color: #339933;">--;</span> <span style="color: #666666; font-style: italic;">//i-=1;と同じ</span></pre></td></tr></table></div>

</p>
<p><strong>■ 比較演算子</strong></p>
<table>
<tr>
<td>a > b</td>
<td>aはbより大きいか？</td>
</tr>
<tr>
<td>a >= b</td>
<td>aはb以上か？</td>
</tr>
<tr>
<td>a < b</td>
<td>aはbより小さいか？</td>
</tr>
<tr>
<td>a <= b</td>
<td>aはb以下か？</td>
</tr>
<tr>
<td>a == b</td>
<td>aはbは等しいか？</td>
</tr>
<tr>
<td>a != b</td>
<td>aはbは等しくないか？</td>
</tr>
</table>
<p><strong>■ 論理演算子</strong></p>
<table>
<tr>
<td>AND</td>
<td>&#038;&#038;</td>
</tr>
<tr>
<td>OR</td>
<td>||</td>
</tr>
<tr>
<td>NOT</td>
<td>!</td>
</tr>
</table>
<p>AND は両方、OR はどちらかが、NOT はではない</p>
<h4>制御文</h4>
<p>プログラムの流れには、順に進む、条件分岐、繰り返しの3種類がある。</p>
<p><strong>■ if</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is larger than bn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>条件式は真のときに、<strong>{ }</strong>（中カッコ）の内部が実行される。<strong>{ }</strong> を省略した場合は、if 文の次に書いてある1文だけ実行することになる。</p>
<p>比較演算子や、論理演算子を組み合わせて使用する。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">,</span> c <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//c が、a 以上かつ b 以下であることを判断する</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&lt;=</span> c <span style="color: #339933;">&amp;&amp;</span> c <span style="color: #339933;">&lt;=</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;c is equal or larger than a, and is equal or smaller tha bn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>条件式の計算結果は真か偽、つまり1か0。C言語では「0だったら正しくない、それ以外だったら正しい」と解釈している。以下の例は正しいということになる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　print <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is truen&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>if-else</strong></p>
<p>if 文では、正しいときに行う処理だけではなく、正しくないときの処理を <strong>else</strong> で記述できる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is larger than bn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is NOT larger than bn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>else-if</strong></p>
<p>if 文を何段階も重ねたい場合、else の後に if を続けることもできる。以下は、a が 0 以下か、0 と 5 の間か、それ以上か、というのを判断するためのもの。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is smaller than 0n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is equal or larger than 0, and smaller than 5n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is equal or larger than 5, and smaller than 10n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is equal or larger than 10n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>■ for</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;i is %dn&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>i = 0;</strong> は初期化の式、<strong>i < 10;</strong> は繰り返しの条件式、<strong>i++</strong> は繰り返しの最後に実行される。</p>
<p><strong>continue と break</strong></p>
<p>繰り返しを途中で強制的にやめたり、次の繰り返しに移動したりする方法。下記の例では、iが2のとき continue を呼び出している。すると、あとの文を無視して次の繰り返しを行う。そしてiが5のときは break 。これを呼ぶと、繰り返しは強制的に終了される。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> cotinue<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;i is %dn&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
　<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>■ while、do</strong></p>
<p><strong>while 文</strong></p>
<p>下記の例は、先ほどの for 文と同じような動作をするもの。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;i is %dn!&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
　i<span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>do-while 文</strong></p>
<p>for 文と while 文では、繰り返しの先頭で条件式がチェックされていたが、これを繰り返しの最後で行うもの。do-while の特徴は、繰り返しの処理が少なくとも1回は実行されるが、for や while だと初めに条件式をチェックするので、1回も実行しないことがあり得る。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;i is %dn&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
　i<span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p><strong>■ switch、case</strong></p>
<p>ある式に対して、その値が0か？ 1か？ 2か？ というのをまとめて書くことができる。case に指定する値は、整数の定数でなくてはいけない。case b: などは不可。小数や文字列も使うことができない。case のあとに break を付けないと、その次の case も実行されてしまう。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
a<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is 0n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
　<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is 1n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
　<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is 2n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
　<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is othern&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>次のような、case の重ねが書きをすることもできる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">:</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a is 0 to 2n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
　<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<h4>関数</h4>
<p><strong>■ 関数の文法</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> square <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

</p>
<p>関数から返ってくる値のことを<strong>返り値</strong>と呼ぶ。だから、square 関数の先頭にある int は、<strong>返り値の型</strong>を表していることになる。次に、関数に渡す値のことを<strong>引数</strong>と呼ぶ。先ほどの (int value) が引数。引数は、変数の宣言と同じ型で書く。変数の宣言は型と名前でできているので、それぞれ<strong>引数の型</strong>、<strong>引数の名前</strong>と呼ぶ。下記のような文法になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">返り値型　関数名 <span style="color: #009900;">&#40;</span>引数型　引数名<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

</p>
<p>引数は、複数指定することもできる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> arg0<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> arg1<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> arg2<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

</p>
<p><strong>return 文</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> square <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
　<span style="color: #b1b100;">return</span> value <span style="color: #339933;">*</span> value<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>ここでは、引数 value を使って1乗の計算を行っている。<strong>return</strong> は関数の返り値を指定して、そこで関数の実行を終了させるもの。<strong>return</strong> の後には変数や式がくる。その値が、関数の返り値として使われる。そして、例えその後にプログラムが続いていても、関数の実行をそこで終えて、呼び出し元に戻る。</p>
<p><strong>void 型</strong></p>
<p>関数によっては返り値がないものもある。そんなときのために、<strong>void 型</strong>という特別な関数がある。void は無効という意味。返り値型として void を使っている関数では、return で返り値を返す必要がない。例えば、下記のような Hello World! と表示する関数など。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #993333;">void</span> printHelloWorld<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
　<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello World!n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>関数の呼び出し</strong></p>
<p>関数の呼び出し方は以下。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> result<span style="color: #339933;">;</span>
result <span style="color: #339933;">=</span> square<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>呼び出すときは関数の名前を使う。その後にはカッコをつける。関数が引数を取る時は、その数だけ引数を指定する。関数が返り値を返す場合は、変数に代入する。</p>
<h4>関数の宣言と実装</h4>
<p>関数を書く時には、<strong>関数の宣言（.h）</strong>と<strong>関数の実装（.c）</strong>とにファイルを分けることになる。関数の宣言ファイルには、関数の名前、返り値、引数の定義だけを書く。関数の実装ファイルには実際の処理を書く。</p>
<h4>可変引数</h4>
<p>ここまで何度も使っている <strong>printf 文</strong>。<strong>printf</strong> 関数の宣言は、stdio.h というファイル（/usr/include/stdio.h）にある。 ※Finder の「移動 > フォルダへ移動」で表示させる</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> __restrict<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span> __DARWIN_LDBL_COMPAT<span style="color: #009900;">&#40;</span><span style="color: #000066;">printf</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>この中の <strong>&#8230;</strong> は、この関数に指定できる引数の数は固定ではない、ということを示している。このような引数の指定の仕方を<strong>可変引数</strong>と呼ぶ。</p>
<h4>標準ライブラリ</h4>
<p>「/usr/include/」の中には、たくさんの便利な関数が提供されている。これらの機能はすべて Cocoa プログラミングの中でカバーされている。以下はその例。</p>
<p><strong>stdio.h</strong></p>
<p>結果の出力や、キーボードからの入力を受け付ける。ファイルの入出力も担当する。printf もここに含まれる。</p>
<p><strong>string.h</strong></p>
<p>文字列を操作するための関数を集めたもの。</p>
<p><strong>math.h</strong></p>
<p>数学に関する関数を集めたもの。</p>
<p><strong>stdlib.h</strong></p>
<p>文字と数値の間で変換をしたり、メモリを確保したりする。</p>
<h4>構造体</h4>
<p><strong>■ 構造体の宣言</strong></p>
<p>構造体は、いくつかの変数をまとめておくためのもの。例えば、座標を管理するために x と y という2つの変数が必要になる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//座標のための2つの変数</span>
<span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>この2つの値は常にペアで使うことになるので、x と y という2つの変数をまとめた、point という名前の<strong>構造体</strong>を次のように定義できる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//point という構造体</span>
<span style="color: #993333;">struct</span> point <span style="color: #009900;">&#123;</span>
　<span style="color: #993333;">int</span> x<span style="color: #339933;">;</span>
　<span style="color: #993333;">int</span> y<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p><strong>struct</strong> というのが構造体のためのC言語のキーワード。そして、point という構造体の名前が続く。その後には中カッコと、構造体が含む変数の宣言がある。この、x と y といった構造体が持つ変数のことを<strong>フィールド</strong>と呼ぶ。</p>
<p>■ <strong>構造体の使い方</strong></p>
<p>定義した構造体は、次のように使う。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//point 構造体の、pt という名前の変数を宣言する</span>
<span style="color: #993333;">struct</span> point pt<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//pt のフィールドに値を設定する</span>
pt.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
pt.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>まず、構造体の変数を宣言する。その時は先頭に <strong>struct</strong> を付ける必要がある。ここでは pt という名前の変数にしている。次に、構造体が持つフィールドにアクセスする。それには <strong>.（ドット）</strong>を使う。ドットの後にフィールドの名前を書くことで、フィールドに値を設定したり、取り出したりする。これで座標に関する情報をまとめておくことができる。</p>
<p><strong>■ typedef を使った構造体の型の宣言</strong></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//構造体を使った型を宣言する</span>
<span style="color: #666666; font-style: italic;">//point という名前の型にする</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
　<span style="color: #993333;">int</span> x<span style="color: #339933;">;</span>
　<span style="color: #993333;">int</span> y<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> point<span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p><strong>typedef</strong> は新しい型を宣言するためのもの。この構造体の型を使うと、次のようにコードを書くことができる。</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//point を使って変数を宣言する</span>
point pt<span style="color: #339933;">;</span>
pt.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
pt.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>point を、int や char といった型と同じように使うことができる。</p>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-16-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</title>
		<link>http://www.head-t.com/2008/12/2008-12-12-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-12-01.html#comments</comments>
		<pubDate>Thu, 11 Dec 2008 18:27:31 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=133</guid>
		<description><![CDATA[「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。 チュートリアル: Hello World! Cocoa バージョンの Hello World ウィンドウにはテキストフ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7579" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-01-350x132.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="132" class="size-medium wp-image-7579" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>チュートリアル: Hello World!</h3>
<h4>Cocoa バージョンの Hello World</h4>
<p>ウィンドウにはテキストフィールドと Say Hello というボタンがあり、ボタンを押すと Hello World! とテキストフィールドに表示する。</p>
<h4>開発の手順</h4>
<ul>
<li><strong>【1】Xcode を起動する</strong></li>
<li><strong>【2】プロジェクトを作成する</strong> 「ファイル > 新規プロジェクト」から、Mac OS X の Application カテゴリにある Cocoa Application を選択する。</li>
</ul>
<h4>クラスの作成</h4>
<ul>
<li><strong>【3】クラスを作成する</strong> 「ファイル > 新規ファイル」から、Mac OS X<br />
    カテゴリの下にある、 <strong>Object-C class</strong> を選択する。ファイル名として <strong>AppController</strong> と入力する。その下に「同時に AppController.h も作成」チェックボックスがあるので、これがオンになっていることを確認する。この2つのファイルはグループとファイルにある Classes のグループに移動しておく。</li>
</ul>
<p><strong>■ クラスの宣言</strong></p>
<p>AppController の宣言を行う。AppController.h ファイルを開いて、インスタンス変数とメソッドを1つづつ追加する。</p>
<ul>
<li> <strong>【4】クラスの宣言</strong>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
IBOutlet <span style="color: #a61390;">id</span> textField;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
<p>このように、textField というインスタンス変数、sayHello: というメソッドを追加する。編集が終わったら保存する。textField の方には <strong>IBOutlet</strong>、sayHello: の方には、返り値が <strong>IBAction</strong> というものになっているのは、ここで追加したインスタンス変数を<strong>アウトレット</strong>、メソッドを<strong>アクション</strong>と呼ばれるものにしているため。アウトレットは Interface Builder で追加した部品を指し示すもの、アクションはユーザがボタンを押したときの通知を受け取るものになる。</p>
</li>
</ul>
<h4>Interface Builder でのユーザインタフェースデザイン</h4>
<p>■ <strong>xibファイル</strong></p>
<p>Interface Builder で作成した書類は、2.0までは <strong>.nib</strong>、3.0からは <strong>.xib</strong> という拡張子がつく。それぞれ nib（ニブ）ファイル、xib（ジブ）ファイルと呼ぶ。</p>
<ul>
<li><strong>【5】xib ファイルを開く</strong> プロジェクトウィンドウの「グループとファイル」で、Resource フォルダの中にある <strong>MainMenu.xib</strong> ファイルを開く。 </li>
</ul>
<h4>Interface Builder のウィンドウ</h4>
<p><strong>■ xib ウィンドウ</strong></p>
<div id="attachment_7580" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-02.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-02-350x132.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="132" class="size-medium wp-image-7580" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>xib ファイルの内容を表示するもの。Interface Builder での作業は、このウィンドウが中心になる。</p>
<p><strong>■ アプリケーションのメインウィンドウ</strong></p>
<div id="attachment_7581" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-03.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-03-350x66.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="66" class="size-medium wp-image-7581" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>このウィンドウの中にユーザインタフェースをデザインしていく。このウィンドウは、xib ウィンドウにある <strong>Window</strong> というファイルを開いたものになる。</p>
<p><strong>■ メニューウィンドウ</strong></p>
<div id="attachment_7582" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-04.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-04-350x52.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="52" class="size-medium wp-image-7582" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>アプリケーションのメニューを表示するもの。xib ウィンドウの <strong>MeinMenu</strong> を開いたものになる。</p>
<p><strong>■ ライブラリ</strong></p>
<div id="attachment_7583" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-05.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-05-350x132.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="132" class="size-medium wp-image-7583" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>ユーザインタフェースをデザインするための部品を提供するためのパネル。アプリケーションのメインウィンドウにドラッグすることで、ユーザインタフェースをデザインしていく。このパネルは「Tools > Library」メニューから表示できる。</p>
<p><strong>■ インスペクタ</strong></p>
<div id="attachment_7585" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-06.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-06-350x132.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="132" class="size-medium wp-image-7585" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<p>選択した項目の詳しい情報を表示するパネル。「Tools > inspector」メニューから表示できる。パレットから追加した部品のさまざまな設定を行うことができる。</p>
<p><strong>■ ユーザインタフェースのデザイン</strong></p>
<ul>
<li><strong>【6】ユーザインタフェースをデザインする</strong> メインウィンドウにユーザインタフェースの部品を並べていく。ライブラリで「Cocoa > View&amp;Cells > Inputs&amp;Values」を選択して、テキストフィールドをウィンドウにドラッグする。次に、「Cocoa > View&amp;Cells > Buttons」のタブを表示して、ボタンをドラッグして追加する。ダブルクリックするとタイトルを入力できるので、Say Hello と書いておく。テキストフィールドとボタンの大きさを調整して、ウィンドウの大きさも調整しておく。</li>
</ul>
<div id="attachment_7586" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-07.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-07-350x92.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="92" class="size-medium wp-image-7586" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<h4>クラスのインスタンス化</h4>
<p>次に、AppController クラスをインスタンス化する。</p>
<h4>クラスのインスタンス化</h4>
<ul>
<li><strong>【7】クラスをインスタンス化する</strong> ライブラリの「Cocoa > Object&amp;Controllers > Controllers」を選択する。Object という名前の青いキューブを、xib ウィンドウにドラッグして追加する。続いて、追加した Object を選択したままインスペクタを表示する。左から6番目にある Identiy のタブを選択する。ここで、先ほど追加した Object を任意のクラスに変更することができる。いま行いたいのは AppController のインスタンス化なので、このタブにある Class コンボボックスから AppController クラスを選ぶと、AppController がインスタンス化される。    ※ドラッグして追加しようとしたとき、カギのアイコンが表示されて追加できない場合がある。そのときはxib ウィンドウのツールバーの info ボタンを押して、Document Locking をNothing にしてロックを解除する。 </li>
</ul>
<h4>アウトレットとアクションの接続</h4>
<p>クラスを作成したら、次はそこからウィンドウ上のテキストフィールドに文字を入力できるようにする必要がある。さらに、ボタンを押したら、クラスに何かの通知を送るようにする。そのため使うのがアウトレットとアクション。</p>
<p>■ <strong>アウトレットとアクションの接続</strong></p>
<p>アウトレットとアクションを、ウィンドウ上の実際のテキストフィールドやボタンと関連づけることを、アウトレットやアクションの接続と呼ぶ。</p>
<ul>
<li>
<p><strong>【8】アウトレットとアクションを接続する</strong> まず、textField を接続する。AppController のインスタンスを選択して、コンロトールキーを押しながらメインウィンドウのテキストフィールドまでドラッグする。アウトレットを表示する黒いウィンドウが開くので、textField アウトレットを選択する。次に、ウィンドウ上にあるボタンを選択して、同じようにコントロールキーを押しながら AppController のインスタンスまでドラッグする。sayHello: を選択する。</p>
<p>    接続がきちんと行われたかを確認するには、AppController のインスタンスをコントロールキーを押しながらクリックする。 </li>
</ul>
<div id="attachment_7587" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-08.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-12_01-08-350x92.jpg" alt="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" title="【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション" width="350" height="92" class="size-medium wp-image-7587" /></a><p class="wp-caption-text">【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション</p></div>
<h4>AppController の実装</h4>
<p>Xcode で、AppController のためのソースコードを書く。ソースコードの内容は、テキストフィールドに Hello World! という文字を表示するもの。</p>
<p>■ <strong>アクションの実装</strong></p>
<ul>
<li><strong>【9】AppController.m を編集する</strong>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> AppController
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
<span style="color: #002200;">&#91;</span>textField setStringValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello World!&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

</p>
</li>
</ul>
<p>編集が終わったら保存する。</p>
<h4>ビルドと実行</h4>
<ul>
<li><strong>【10】ビルドと実行をする</strong> 「ビルド > ビルドして進行」メニューを選択するか、ツールバーから「ビルドして進行」をクリック。</li>
</ul>
<h3>モデル・ビュー・コントローラアーキテクチャ</h3>
<h4>MVC アーキテクチャとは</h4>
<p>MVC（モデル・ビュー・コントローラアーキテクチャ）は、アプリケーションを作るときに、どこからクラスを作っていけばいのかという疑問に答えてくれるもの。MVCアーキテクチャでは、作成するクラスを3つの種類に分類することになる。名前にあるように、モデル、ビュー、コントローラの３つ。</p>
<p><strong>■ モデル</strong></p>
<p>モデルは、アプリケーションのデータを表すためのクラス。たとえばワープロのようなアプリケーションの目的は文章を作ること。作った文章を保存したり印刷したりすることになる。この<strong>作った文章</strong>を担当するクラスが<strong>モデル</strong>。モデルクラスの中身はテキストということになり、仕事としては、ファイルへの保存や読み込みといったものになる。</p>
<p><strong>■ ビュー</strong></p>
<p>ビューはアプリケーションの概観にあたる。たとえばウィンドウ、ボタン、スライダー、スクロールバーといったもの。こういったユーザインタフェースの部品が、ビューに属するクラスになる。ビューの仕事は主に2つ。1つは、ユーザに見えるようにデータを表示すること。テキストフィールドいはテキストを表示するし、テーブルにはデータを並べる。もう1つは、ユーザからの操作を受け付けること。ユーザはマウスやキーボードを介してビューを操作する。ボタンはクリックするし、テキストビューには文字を打ち込む。</p>
<p><strong>■ コントローラー</strong></p>
<p>モデルとビューをつなぐもの。モデルはアプリケーションのデータ、ビューはそのデータを表示するもの。その間に位置してデータをやり取りすりものがコントローラ。モデルとビューの両方にアクセスするもの。</p>
<h4>MVC の例</h4>
<p><strong>■ iTunes のモデル</strong></p>
<p>iTunes が扱うデータは<strong>曲</strong>なので、これをモデルにする。曲を表すクラスとして Tracks というクラスを作り、曲のデータを管理する。たとえば、曲名、アーティスト名、アルバム名、再生時間、リリースされた年など。</p>
<p><strong>■ iTunes のビュー</strong></p>
<p>iTunes のユーザインタフェース。iTunes には Tracks をテーブルで表示するビューがある。また、ブラウザスタイルで表示するビューもあるし、Cover Flow で表示するビューもある。これらを実現するための部品が、ビューのクラスとなる。</p>
<p><strong>■ iTunes のコントローラ</strong></p>
<p>Tracks クラスと先ほどのさまざまなスタイルのビューの間に位置することになる。たとえばテーブルスタイルのビューでは、ユーザの絞り込み条件にあった曲をテーブルに配置して並べることになっている。この仕事を行うのがコントローラ。これを <strong>TableController</strong> というクラスにやらせることにする。同様に、 ブラウザスタイルの <strong>BrowserController</strong>、Cover Flow のための <strong>CoverFlowController</strong> などを作る。</p>
<h4>MVC にもとづくアプリケーションの作り方</h4>
<p><strong>■ ビューは Cocoa が提供</strong></p>
<p>Interface Builder のパレットにあるたくさんの部品が、Cocoa が提供するビュー。しかし、Cover Flow を実現するようなビューは Cocoa にはないので、自分でビューを作る。その場合、Cocoa のビューの流儀に則って作ることになる。</p>
<p><strong>■ ビューとモデルは互いに独立</strong></p>
<p>ビューはビューだけで動くようにして、モデルはモデルだけで動くようにする。ビューはある特定のアプリケーションのためにデザインされているのではなく、汎用的に利用できるようになっている。モデルも同様に、あくまでデータの形だけをみて設計する。どのビューを使ってもモデルは同じにしたい。つまり、モデルはビューから独立した形でデザインする。こうすることで、再利用性が高まる。</p>
<p><strong>■ アプリケーション特有の機能を受け持つのがコントローラ</strong></p>
<p>そのアプリケーション特有の機能は、コントローラに入れる。モデルである Tracks は曲情報を持っている。ビューであるテーブルビューは、データをテーブルに表示することができる。Tracks の情報をどのようにテーブルに並べるかという仕事を受け持つクラスが、コントローラである TableController ということになる。</p>
<p><strong>■ モデルとコントローラのクラスを作る</strong></p>
<p>アプリケーションを作るときは、モデルとコントローラのためのクラスを作る。まず、アプリケーションで扱うデータをきちっと定義する。iTunes ならが曲情報だし、テキストエディタならテキストデータということになる。それを管理するモデルクラスをデザインする。モデルが決まったら、Cocoa が提供するビューを使ってユーザインタフェースをデザインする。そして、モデルとビューをつなぐために、コントローラクラスを作る。このコントローラクラスの実装が、プログラミングの中心になる。Hello World で作ったクラスに <strong>AppCortroller</strong> という名前をつけたのは、このクラスがコントローラになるため。</p>
<h3>アウトレットとアクション</h3>
<h4>ビューとコントローラのやり取り</h4>
<p>モデルはアプリケーションのデータ、ビューはデータの表示、コントローラはモデルとビューの間に位置するもの。このコントローラの仕事をもう少し突っ込んででみると、2種類に分けることができる。1つはモデルからデータを取得してビューに設定するというもの。もう1つはユーザがビューを操作したときビューからの通知を受けてモデルの値を変更するというもの。この2つの対応を繰り返し行っていくことでアプリケーションが出来上がっていく。</p>
<h4>アウトレットとアクション</h4>
<p><strong>■ アウトレットとは</strong></p>
<p>アウトレットとはコンセントの穴という意味。あの感覚で、ビューとコントローラの間に関連を作る。</p>
<p>アウトレットはコントローラに付けることになる。Hello World の場合、コントローラとして AppController というクラスを作った。これがビューを接続するための穴。コントローラの仕事の1つは、ビューに値を設定すること。そのためにアウトレットを経由してビューへアクセスできるようにしている。ということは、コントローラがアクセスする必要があるビューの分だけアウトレットを作ることになる。だから新しいビューオブジェクトを追加したらアウトレットも追加すること。</p>
<p>アウトレットの実体はインスタンス変数。アウトレットを追加すると、コントローラのクラスにはインスタンス変数として追加される。Hello World で作ったコントローラクラスのファイル、AppController.h の</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#123;</span> IBOutlet <span style="color: #a61390;">id</span> textField; <span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</p>
<p>が、アウトレットのためのインスタンス変数。</p>
<p><strong>■ アクションとは</strong></p>
<p>ビューの操作を受け付けるのがアクション。アウトレットがビューを参照するのに対して、アクションはビューからの通知を受け付けるもの。これで、ユーザの操作を受け取ることもできる。まず、ビューにアクションを登録する。そして、ユーザからの操作があると、登録したアクションが呼び出される。</p>
<p>アクションの実体はメソッド。Hello World で作ったコントローラクラスのファイル、AppController.h の</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>sayHello<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;</pre></td></tr></table></div>

</p>
<p>が、アクションのためのメソッド。Say ボタンを押すと、IBAction が呼び出されることになる。</p>
<h4>アウトレットとアクションの接続</h4>
<p><strong>■ アウトレットとアクションの追加</strong></p>
<p>まず該当するクラスにアウトレットとアクションを追加する。この作業は原則として Xcode で行う。ここは、Interface Builder が 3.0 にバージョンアップしたときに大きく変更されたところ。ということで、アウトレットやアクションを追加したいときは、Xcode でクラスの編集をする。アウトレットの実体はインスタンス変数、アクションの実体はメソッド。それぞれ先頭に、<strong>IBOutlet</strong>、<strong>IBAction</strong> を書くようにする。</p>
<p>Xcode 側でソースコードを編集すると、自動的にその変更が Interface Builder に反映さえることになる。</p>
<p><strong>■ アウトレットの接続</strong></p>
<p>接続をするときは、対象となるクラスのインスタンスを作っておく必要がある。まずインスタンスを選択して、そこからコントロールキーを押しながらターゲットとなるユーザインタフェースにドロップする。小さい黒いウィンドウが現れるので、ここから接続するアウトレットを選ぶ。</p>
<p>接続できる対象はウィンドウ上の部品だけではなく、ウィンドウそのものや、他のインスタンス化したオブジェクトも接続できる。xib ウィンドウにあるインスタンスなら、どれでも接続できる。</p>
<p><strong>■ アクションの接続</strong></p>
<p>こちらの場合は、ユーザインタフェースの方からドラッグすることになる。まずアクションを送るユーザインタフェースを選択、コントロールキーを押しながらアクションを送るインスタンスにドロップ。小さい黒いウィンドウが開くので、そこからアクションを選択する。アクションはウィンドウ上のユーザインタフェースの他に、メニューからも接続できる。その場合、メニューを選択するとそのアクションが呼び出されることになる。</p>
<p><strong>■ 接続の確認</strong></p>
<p>接続を一覧表示したい場合には、対象となるインスタンスをコントロールキーを押しながらクリックする。この黒い半透明のウィンドウからも接続や解除ができる。</p>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-12-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング</title>
		<link>http://www.head-t.com/2008/12/2008-12-11-01.html</link>
		<comments>http://www.head-t.com/2008/12/2008-12-11-01.html#comments</comments>
		<pubDate>Thu, 11 Dec 2008 11:34:47 +0000</pubDate>
		<dc:creator>大森</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[たのしいCocoa]]></category>

		<guid isPermaLink="false">http://tyoht.kir.jp/wp/?p=132</guid>
		<description><![CDATA[iPhone アプリを作りたい！ どんなに素晴らしいアイデアがあっても、それを誰かが拾ってくれて形にしてくれる訳ではないのですよね。実際に自分で形にして、それを流通させてこそのアイデアなのです。 「たのしいCocoaプロ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7589" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-01.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-01-350x132.jpg" alt="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" title="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" width="350" height="132" class="size-medium wp-image-7589" /></a><p class="wp-caption-text">【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング</p></div>
<p>iPhone アプリを作りたい！</p>
<p>どんなに素晴らしいアイデアがあっても、それを誰かが拾ってくれて形にしてくれる訳ではないのですよね。実際に自分で形にして、それを流通させてこそのアイデアなのです。</p>
<p>「<a href="http://www.amazon.co.jp/gp/product/4861005949?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4861005949" target="_blank">たのしいCocoaプログラミング[Leopard対応版]</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4861005949" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を元に、要約メモしておきたいと思います。</p>
<h3>開発環境のインストール</h3>
<p>まずはこちらの手順にしたがって、XcodeやiPhone SDKなどの開発環境をインストールしておきます。<br />
<span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone/0002" target="_blank">目指せ！iPhoneアプリ開発エキスパート：第2回　iPhone SDKの入手と設定｜gihyo.jp &#8230; 技術評論社</a></p>
<p>「Developer &gt; Applications」にある <strong>Xcode</strong> と <strong>Interface Builder</strong> が特に重要なアプリ。</p>
<p>「アプリケーション &gt; ユーティリティ &gt; ターミナル」から打ち込む命令のことをコマンドと呼ぶ。これもアプリケーションの一種で、<strong>コマンドアプリケーション</strong>、または<strong>コマンドラインアプリケーション</strong>と呼ばれる。コマンドの場合は、コマンドの操作にもその結果の表示にもテキストを使うことになる。これを、GUI（グラフィカルユーザインタフェース）に対して CUI（キャラクタユーザインタフェース）と呼ぶ。</p>
<h3>アプリケーションとフレームワーク</h3>
<h4>Mac OS X のフレームワーク</h4>
<p><strong>■ フレームワークの在所</strong></p>
<p>「/システム/ライブラリ/Frameworks」にある <strong>.Framework</strong> という拡張子をもったフォルダが、フレームワークの実体。</p>
<p><strong>Carbon</strong> は OS 9 で動いていたアプリケーションを OS X でも動くように用意されたフレームワークで、<strong>Cocoa</strong> は OS X から新しく登場したフレームワーク。Carbon と Cocoa はお互いに排他的ではなく、それぞれ得意な分野がある。メインは Cocoa アプリケーションで、必要に応じて Carbon を利用するという使い方もできる。しかし、OS X の新技術は Cocoa アプリケーションから使用されることを前提としているものが多いので、Cocoa の方が有利。また、Carbon フレームワークはどんどん整理が進められているので、推奨されない部分はいずれ切り捨てられる恐れがある。</p>
<h3>Cocoa と Objective-C</h3>
<h4>フレームワークとプログラミング言語</h4>
<p><strong>■ API（アプリケーション・プログラミング・インタフェース）</strong></p>
<p>Cocoa に限らずフレームワークにはその機能を呼び出すための窓口がついている。アプリケーションはその窓口を経由してフレームワークを操作する。この窓口のことを API（アプリケーション・プログラミング・インタフェース）と呼ぶ。フレームワークを学ぶというのは API の使い方を学ぶということ。フレームワークの善し悪しも、API がいいかどうかで決まる。</p>
<p>Cocoa の API は <strong>Objective-C</strong> で提供されているが、ブリッジを経由して Cocoa を操作することもできる。Ruby、Python からも Cocoa を操作できるが、予想外の問題が起こったりするデメリットもある。</p>
<h3>開発用アプリケーション</h3>
<h4>開発のためのアプリケーションと作業の流れ</h4>
<p><strong>■ アプリケーションを作る材料</strong></p>
<ul>
<li><strong>ソースコード</strong><br />
電卓を作るなら計算の処理、RSSリーダならRSSの読み込みとその解釈などの処理。</li>
<li><strong>ユーザインタフェースのレイアウト</strong><br />
Cocoa の開発では、ユーザインタフェースをデザインするためのアプリケーション、Interface Builder がある。</li>
<li><strong>画像リソース</strong><br />
アプリケーションアイコンや書類ファイルのアイコン、ツールバーボタンのアイコンなど。「このアプリケーションについて」メニューから表示できるアバウト画面の画像など。こういった、ソースコード以外で必要になるファイルのことを<strong>リソース</strong>と呼ぶ。 </li>
<li><strong>アプリケーションの設定</strong><br />
アプリケーションの名前や著作権情報、バージョン番号など。こういった情報は設定ファイルに記述する。この設定ファイルはプロパティリストという特別なフォーマットになる。これを編集するためのアプリケーションが、Xcodeに含まれる <strong>Property List Editor</strong>。 </li>
</ul>
<p><strong>■ ビルドの手順</strong></p>
<p>ソースコードや画像リソースなどからアプリケーションを作り上げることを<strong>ビルド</strong>と呼ぶ。</p>
<ol>
<li><strong>コンパイル</strong><br />
コンパイルは翻訳の意味。ソースコードをコンピュータに分かるように翻訳すること。コンパイルするとコンピュータが理解できるファイルができあがる。0と1が並んでいるファイルになるから、<strong>バイナリファイル</strong>と呼ぶ。<strong>.o</strong> という拡張子がつく。 </li>
<li><strong>リンク</strong><br />
コンパイルすると、ソースコードの数だけバイナリファイルができあがることになる。これらをまとめて1つのプログラムファイルに仕上げる処理のことを<strong>リンク</strong>と呼ぶ。リンクするときは使用しているフレームワークの情報も付け加えておく。これにより、プログラムを実行したときにフレームワークが自動的に読み込まれるようになる。リンクしてできあがったものは<strong>実行ファイル</strong>と呼ぶ。 </li>
<li><strong>バンドル</strong><br />
実行ファイルと、画像リソースやユーザインタフェースのレイアウトやアプリケーションの情報などをまとめあげることを<strong>バンドル</strong>と呼ぶ。このファイルには <strong>.app</strong> の拡張子がつく。 </li>
</ol>
<p><strong>■ gcc</strong></p>
<p>GNU C Compiler の頭文字で、オープンソースのコンパイラ。実体はコマンドラインのアプリケーション。gcc を使ったコンパイル、リンクをいった手順をまとめて管理してくれるアプリケーションが <strong>Xcode</strong>。</p>
<h4>Xcode</h4>
<p><strong>■ 統合開発環境 Xcode の機能</strong></p>
<ul>
<li><strong>ソースコードエディタ</strong><br />
ソースコードを書くためのエディタ。プログラミングに便利な機能がついている。 </li>
<li><strong>ソースコードやリソースファイルの管理</strong><br />
ソースコードや画像リソースなどのファイルを管理してくれる。管理はプロジェクトという単位で行われる（<strong>.xcodeproj</strong> という拡張子）。</li>
<li><strong>ビルド</strong><br />
必要なファイルをそろえたらビルドを行う。コンパイル、リンク、バンドルといった手順をまとめてコマンド一発でやってくれる。 </li>
<li><strong>デバッグ</strong><br />
アプリケーションのテスト作業を行える。 </li>
</ul>
<p>Xcode のようなアプリケーションのことを<strong>総合開発環境</strong>または <strong>IDE（Integrated Development Environment）</strong>と呼ぶ。</p>
<p><strong>■ プロジェクトウィンドウ</strong></p>
<div id="attachment_7590" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-02.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-02-350x132.jpg" alt="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" title="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" width="350" height="132" class="size-medium wp-image-7590" /></a><p class="wp-caption-text">【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング</p></div>
<p>iTunesのような構造で、左側にグループとファイル。それを選択すると右側の詳細表示領域に表示される。レイアウトの変更は「環境設定 &gt; 全般 &gt; レイアウト」から変更できる。</p>
<p>テキストエディタは、.h や .m のファイルをダブルクリックするか、プロジェクトウィンドウの右下のハンドラをドラッグして3ペインで表示させる。ウィンドウのツールバーの下にあるポップアップメニューは、左がファイルの履歴、右がこのソースに含まれる関数、メソッドの一覧。このメニューから素早くアクセスできる。</p>
<div id="attachment_7591" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-03.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-03-350x132.jpg" alt="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" title="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" width="350" height="132" class="size-medium wp-image-7591" /></a><p class="wp-caption-text">【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング</p></div>
<p>テキストエディタ上で <strong>esc キー</strong>を押すことでコードの補完ができる。この候補を表示するタイミングは「環境設定 &gt; コード入力補助」で設定できる。</p>
<p>エンコード、改行コードの変更は、「表示 &gt; テキスト」のファイルエンコーディング、行末コードで行う。「環境設定 &gt; テキスト編集」から、ファイルを開く時に使用する設定を変更できる。</p>
<p>エンコーディングは <strong>UTF-8</strong>、改行コードは <strong>LF</strong> が無難。</p>
<p><strong>■ デベロッパマニュアル</strong></p>
<p>フレームワークが提供するすべての機能を辞書のように調べることができるドキュメントを API リファレンスと呼ぶ。Xcodeには「ヘルプ &gt; 製品ドキュメント」に<strong>デベロッパマニュアル</strong>がある。</p>
<h4>Interface Builder</h4>
<p>ユーザインタフェースのレイアウトを行うデザイナソフトウェア。すべてのデザインを WYSIWYG できる。</p>
<h4>その他のツール</h4>
<p><strong>■ FileMerge</strong></p>
<p>2つのファイルの差分を比較するためのツール。</p>
<p><strong>■ Icon Composer</strong></p>
<p>アイコンファイルを作成するためのアプリケーション。OS X ではアイコンは <strong>.icns</strong> という拡張子をもつ。</p>
<p><strong>■ Property List Editor</strong></p>
<p>OS X ではアプリケーションのさまざまな情報をプロパティリストというフォーマットで記述する。その専用エディタ。</p>
<p><strong>■ PackageMaker</strong></p>
<p>インストーラ作成のためのツール。</p>
<h3>オブジェクト指向</h3>
<h4>オブジェクト指向の5つの用語</h4>
<p><strong>■ クラス</strong></p>
<p>設計図のこと。アプリケーションを起動するとウィンドウが表示されるが、それは<strong>ウィンドウクラス</strong>という設計図から作られる。ウィンドウ上のボタンは<strong>ボタンクラス</strong>という設計図から作られる。このように、プログラミングで使うウィンドウやボタンといった<strong>もの</strong>のために、クラスという設計図を作っておく、これがオブジェクト指向の考え方。</p>
<p><strong>■ インスタンス</strong></p>
<p>設計図をもとに作り出した<strong>もの</strong>がインスタンス。具体的なものという意味で、クラスという設計図を具体化したもの。実際に動いているのは、ボタンクラスから作られた<strong>ボタンインスタンス</strong>。動作させるには、クラスからインスタンスを作り出す必要がある。クラスからインスタンスを作り出すことを<strong>インスタンス化</strong>と呼ぶ。</p>
<p><strong>■ インスタンス変数</strong></p>
<p>ボタンに表示させるタイトルやウィンドウ上でのボタンの位置とか、これらの値をインスタンスごとにそれぞれ管理する。これを<strong>インスタンス変数</strong>と呼ぶ。インスタンス変数は設計図であるクラスで定義される。そしてインスタンス化すると、インスタンスごとにインスタンス変数を確保する。インスタンスは、インスタンス変数をまとめておくための入れ物。</p>
<p><strong>■ メソッド</strong></p>
<p>インスタンス変数を確保できたら、次はそれを操作する手段が必要。ボタンにタイトルを設定する、ボタンを動かす、ボタンを押したときに行う処理などといった操作。こういった処理を行うものを<strong>メソッド</strong>と呼ぶ。メソッドには2種類ある。インスタンス変数の値を設定したりなど、インスタンスに対して処理を行うものを<strong>インスタンスメソッド</strong>、クラス全体に対する処理を行うものは<strong>クラスメソッド</strong>と呼ぶ。代表的なクラスメソッドは、インスタンス化を行うメソッド。</p>
<p><strong>■ 継承</strong></p>
<p>何かを基にしてそれを拡張するというイメージで、実際にはクラスを継承する。通常のテキストフィールドからセキュアテキストフィールドや検索フィールドを作成するためなどに、あるクラスの機能を継承して新しいクラスを作ること。基になったクラスを<strong>親クラス</strong>や<strong>スーパークラス</strong>、新しいクラスを<strong>サブクラス</strong>と呼ぶ。独自のインスタンス変数をメソッドを追加することができ、親クラスのメソッドを上書きすることもできる。</p>
<p><strong>■ 用語の関連図</strong></p>
<p>[クラス [クラスメソッド] クラス]<br />
これをインスタンス化すると、<br />
[インスタンス [インスタンス変数] [インスタンスメソッド] インスタンス]</p>
<p><strong>■ オブジェクトは？</strong></p>
<p>Objective-C でのオブジェクトを定義するなら、クラスとオブジェクトの両方を指すものとなる。本書では、<strong>クラスオブジェクト</strong>と<strong>インスタンスオブジェクト</strong>と区別して呼ぶ。</p>
<h4>Cocoa での実例</h4>
<p><strong>■ ウィンドウ上にボタンを配置</strong></p>
<div id="attachment_7592" class="wp-caption alignnone" style="width: 360px"><a class="fancy" href="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-04.jpg"><img src="http://www.head-t.com/wp-content/uploads/2008/12/2008-12-11_01-04-350x132.jpg" alt="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" title="【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング" width="350" height="132" class="size-medium wp-image-7592" /></a><p class="wp-caption-text">【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング</p></div>
<ol>
<li><strong>クラスを確認する</strong><br />
Cocoa にはあらかじめ <strong>NSButon</strong> というクラスがあるので、それを使う。 </li>
<li><strong>インスタンス化してインスタンスを作成する</strong><br />
ボタンを作るには、クラスをインスタンス化する必要があるので、まずは NSButton クラスのインスタンスを作る。この手順は Interface Builder で行う。</li>
<li><strong>インスタンスメソッドを呼び出して、タイトルを設定する</strong><br />
ボタンには、タイトルを表すインスタンス変数がある。これをインスタンスメソッドを使って設定する。NSButton クラスの、タイトルを設定するためのインスタンスメソッドは <strong>setTitle:</strong> 。<br />
これを呼び出すことでタイトルを設定できる（setTitle:@&quot;Push Me!&quot;）。または、Interface Builder でその設定を行うことができる。</li>
</ol>
<p><strong>■ テキストフィールドの継承</strong></p>
<p>Cocoa では、テキストフィールドを表す <strong>NSTextField</strong> というクラスが提供されている。そのサブクラスもいくつかある。パスワード入力に使われる <strong>NSSecureTextField クラス</strong>、検索フィールドである <strong>NSSearchField</strong>、コンボボックスである <strong>NSComboBox</strong>、トークン分割ができる <strong>NSTokenField</strong> 。NSTextField も他のクラスを継承している。こういう継承の連なりを、<strong>クラス階層</strong>と呼ぶ。クラス階層をたどっていくと、必ず大元のクラスにたどりつく。このクラスのことを<strong>ルートクラス</strong>と呼ぶ。Cocoa の場合、ルートクラスは <strong>NSObject</strong> というクラス。</p>
<h3 class="link">外部リンク</h3>
<ul class="link">
<li class="link"><span class="icon">&raquo;</span><a href="http://gihyo.jp/dev/serial/01/iphone" target="_blank">連載：目指せ！iPhoneアプリ開発エキスパート｜gihyo.jp &#8230; 技術評論社</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://blog.sohaya.com/?p=4104" target="_blank">iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://journal.mycom.co.jp/special/2008/iphone/menu.html" target="_blank">【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル</a></li>
<li class="link"><span class="icon">&raquo;</span><a href="http://www.amazon.co.jp/gp/product/4048676067?ie=UTF8&#038;tag=headterminal-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4048676067" target="_blank">自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全</a><img src="http://www.assoc-amazon.jp/e/ir?t=headterminal-22&#038;l=as2&#038;o=9&#038;a=4048676067" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.head-t.com/2008/12/2008-12-11-01.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  www.head-t.com/tag/cocoa/feed ) in 6.38748 seconds, on Feb 9th, 2012 at 4:45 pm JST. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 9th, 2012 at 5:45 pm JST -->
