<?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>iOS 開発ブログ Natsu&#039;s note</title>
	<atom:link href="http://blog.natsuapps.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.natsuapps.com</link>
	<description>iOS開発日記。開発Tipsや読んだ本の紹介などなど。</description>
	<lastBuildDate>Sun, 20 May 2012 01:07:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[Clock Tuto] まなびはあそび。とけいのよみかたゲームリリース</title>
		<link>http://blog.natsuapps.com/2012/03/clocktuto_released.html</link>
		<comments>http://blog.natsuapps.com/2012/03/clocktuto_released.html#comments</comments>
		<pubDate>Fri, 16 Mar 2012 08:20:12 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[アプリサポート]]></category>
		<category><![CDATA[Clock Tuto]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=1008</guid>
		<description><![CDATA[昨年から関わってきたiPad用教育ゲーム、「とけいのよみかたゲーム Clock Tuto」を無事にリリースすることができました。 企画は主に@mat_jpさんが、開発は私がメインで行っています。 とにかく、勉強していると <a href='http://blog.natsuapps.com/2012/03/clocktuto_released.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
昨年から関わってきたiPad用教育ゲーム、「とけいのよみかたゲーム Clock Tuto」を無事にリリースすることができました。
</p>
<p>
企画は主に<a href="http://twitter.com/mat_jp/" target="_blank">@mat_jp</a>さんが、開発は私がメインで行っています。
</p>
<p>
とにかく、勉強しているということを意識せず、遊んでいるうちに色々なことが身に付くようなゲームを作りたくて、あれこれ試行錯誤しながら、今の形にたどり着きました。まだまだ至らないところはありますが、これからも少しずつ改善していく予定です。
</p>
<p>
Clock Tutoは、落ちものゲームの一種です。上から落ちてくる時計を適切な箱に入れることで、時計の読み方を習得していきます。
</p>
<p>
最初は、子供たちにとって身近な、食事時間と起床、就寝時間から始めます。その後、ちょうどの時間、30分、15分&#038;45分と少しずつ難しくなっていき、最後は、任意の時間が読めるようになるというものです。
</p>
<p>
段階を経て進めていくうちに、自然と時計の読み方が身に付くような仕組みを心がけました。
</p>
<p>
実際、何人かの子供たちにお願いしたユーザーテストを見ていても、徐々に時計の読み方に慣れていく様子が確認できました。
</p>
<p>
今後も、子供たちに喜んでもらえるようなアプリを出していきたいと思っています。
</p>
<p>
Clock Tutoはただいまリリース記念セール中（85円）。この機会にぜひ！
</p>
<p>
<img style="float:left; padding-right:10px;" src="http://blog.natsuapps.com/wp-content/uploads/512-512.png" alt="とけいのよみかたゲーム Clock Tuto" title="512-512.png" border="0" width="100" height="100" /></p>
<p>Clock Tuto サポートサイト: <a href="http://tutoapps.com/" target="_blank">http://tutoapps.com/</a><br />
Clock Tuto ツイッターアカウント: <a href="http://twitter.com/tutoapps_jp/" target="_blank">http://twitter.com/tutoapps_jp/</a><br />
<a href="http://itunes.apple.com/jp/app/tokeinoyomikatagemu-clock/id507822658?mt=8" target="_blank"><img src="http://blog.natsuapps.com/wp-content/uploads/App_Store_Badge_EN_white_small.png" alt="App Store Badge EN white small" title="App_Store_Badge_EN_white_small.png" border="0" width="150" height="52" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2012/03/clocktuto_released.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ARC][Xcode 4.3] プロパティのデフォルト属性が変更に！</title>
		<link>http://blog.natsuapps.com/2012/03/default-attribute-change.html</link>
		<comments>http://blog.natsuapps.com/2012/03/default-attribute-change.html#comments</comments>
		<pubDate>Fri, 02 Mar 2012 08:56:47 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[Xcode4]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=1005</guid>
		<description><![CDATA[先日App StoreからリリースされたXcode 4.3ですが、個人的には結構驚きな変更がありました。ARCを利用している場合に、プロパティのデフォルト属性（オブジェクトの所有に関する属性）が変更になっているではないで <a href='http://blog.natsuapps.com/2012/03/default-attribute-change.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
先日App StoreからリリースされたXcode 4.3ですが、個人的には結構驚きな変更がありました。ARCを利用している場合に、プロパティのデフォルト属性（オブジェクトの所有に関する属性）が変更になっているではないですか。
</p>
<h3>これまでのデフォルト属性はassign</h3>
<p>
オブジェクトの所有に関するデフォルト属性は、これまでassignでした。したがって、オブジェクトのプロパティで属性指定を行わないと警告が出ていたと思います。
</p>
<p>
また、Xcode 4.2 + ARC環境では属性指定は必須でした。これは、readonlyプロパティのときも同様です。属性を指定しないとエラーとなります（参考：<a href="http://blog.natsuapps.com/2011/11/ios5-arc-property.html">[iOS5] ARC : プロパティ属性と使い方</a>）。エラーになるのは、インスタンス変数生成時にどの所有修飾子をつけていいか分からないためです。
</p>
<h3>Xcode 4.3 + ARCでのデフォルト属性はstrong</h3>
<p>
Xcode 4.3でも、ARCを利用しない場合はこれまでどおりのようですが、ARCを使っているとデフォルト属性がstrongになっています。つまり、属性指定なしでの宣言が可能となったということです。
</p>
<p><pre class="brush: objc; title: ; notranslate">
// interface
@property (nonatomic) NSString *string;

// impliment
@synthesize string;
</pre>
</p>
<p>
この場合、生成されるstring変数はstrongとなります。もちろんエラーも警告も出ません。
</p>
<h3>環境ごとのデフォルト属性</h3>
<p>
実際に、Xcode 4.2, Xcode 4.3で属性指定なしのプロパティがどのように扱われているか、property_getAttributesを使って調べてみました。確認用に用意したコードは以下。showPropertyAttribute内でログを出力し、結果を確認します。</p>
<pre class="brush: objc; title: ; notranslate">
@interface AttributeTest : NSObject

@property (nonatomic) NSString *noattributeStr;
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, weak) NSString *weakStr;
@property (nonatomic, unsafe_unretained) NSString *unsafeunretainedStr;
@property (nonatomic, retain) NSString *retainStr;
@property (nonatomic, assign) NSString *assignStr;

+ (void)showPropertyAttribute;
@end

@implementation AttributeTest

@synthesize noattributeStr, strongStr, weakStr, unsafeunretainedStr, retainStr, assignStr;
+ (void)showPropertyAttribute {
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([self class], &amp;outCount);

    for (int i = 0; i &lt; outCount; i++) {
        objc_property_t property = properties[i];
        fprintf(stdout, &quot;%s\n&quot;, property_getAttributes(property));
    }
}
@end
</pre>
<p>
結果のフォーマットは、&#8221;Tエンコードタイプ, &#8230; ,Vプロパティ名&#8221;となり、カンマ区切りの部分にプロパティの属性が表示されます。例えば、readonlyは&#8221;R&#8221;, retainは&#8221;&#038;&#8221;, weakは&#8221;W&#8221;といった具合です（詳細は、<a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/doc/uid/TP40008048-CH101-SW1" target="_blank">Declared Properties : Objective-C Runtime programming Guide</a>を参照のこと）。
</p>
<h4>Xcode 4.3 + ARC</h4>
<p>
まず、Xcode 4.3でARCを利用した場合の結果です。
</p>
<p>
結果：</p>
<pre class="brush: objc; highlight: [1]; title: ; notranslate">
T@&quot;NSString&quot;,&amp;,N,VnoattributeStr
T@&quot;NSString&quot;,&amp;,N,VstrongStr
T@&quot;NSString&quot;,W,N,VweakStr
T@&quot;NSString&quot;,N,VunsafeunretainedStr
T@&quot;NSString&quot;,&amp;,N,VretainStr
T@&quot;NSString&quot;,N,VassignStr
</pre>
</p>
<p>
この結果より、noattributeStrは&#8221;&#038;&#8221;が表示されているためretainされていることがわかります。つまり、strongプロパティとして扱われていることになります。すぐ下にあるstrongStrと属性が全く同じになっていることが確認できます。
</p>
<h4>Xcode 4.3 + 非ARC</h4>
<p> 次に、Xcode 4.3で非ARCの場合です（以下、noattributeStrの結果のみ表示します）。
</p>
<p>
結果：</p>
<pre class="brush: objc; title: ; notranslate">
T@&quot;NSString&quot;,N,VnoattributeStr
</pre>
</p>
<p>
&#8220;&#038;&#8221;が入っていませんので、これはassignプロパティであることを意味しています。従来どおりの仕様です。なお、非ARC環境で属性指定なしのプロパティを宣言すると、これまでどおりの警告が出ます。</p>
<blockquote><p>
No &#8216;assign&#8217;, &#8216;retain&#8217;, or &#8216;copy&#8217; attribute is specified &#8211; &#8216;assign&#8217; is assumed
</p></blockquote>
<h4>Xcode 4.2 + ARC</h4>
<p>
続いて、Xcode 4.2でARCを用いた場合です。この場合、何もしないとエラーになってしまい確認ができませんので、まずはインスタンス変数を定義します。
</p>
<p><pre class="brush: objc; title: ; notranslate">
@interface AttributeTest : NSObject {
    NSString *noattributeStr;
}
@property (nonatomic) NSString *noattributeStr;
@end
</pre>
</p>
<p>
お察しのとおり、これでもまだエラーとなります。エラーの内容を見ると、</p>
<blockquote><p>
Existing ivar &#8216;noattributeStr&#8217; for unsafe_unretaind property &#8216;noattributeStr&#8217; must be __unsafe_unretained
</p></blockquote>
<p>となっています。これですでに、noattributeStrはunsafe_unretainedプロパティだと分かりました。変数宣言を__unsafe_unretainedに修正し、property_getAttributesを実行します。</p>
<pre class="brush: objc; title: ; notranslate">
@interface AttributeTest : NSObject {
    __unsafe_unretained NSString *noattributeStr;
}
@property (nonatomic) NSString *noattributeStr;
...
@end
</pre>
</p>
<p>
結果：</p>
<pre class="brush: objc; title: ; notranslate">
T@&quot;NSString&quot;,N,VnoattributeStr
</pre>
</p>
<p>
インスタンス変数を__unsafe_unretainedとしているので当たり前の結果ですが、やはりretainされていません。なお、ここでも、Xcode 4.3+非ARCのときと同様の警告が出ます。
</p>
<h4>Xcode 4.2 + 非ARC</h4>
<p>
最後に、Xcode 4.2 + 非ARCの場合です。これは、Xcode 4.3 + 非ARCと全く同じですのでここでは省略します。
</p>
<p>
XcodeのバージョンとARCの有無による違いを見てきましたが、まとめると、<strong>&#8220;Xcode 4.3 + ARC&#8221;のときのみデフォルト属性がstrongとなり</strong>、その他はすべてこれまでどおり、デフォルト属性はassign（またはunsafe_unretained）です。Xcode 4.3でARCを利用する場合、この変更は頭に入れておいた方がよいでしょう。
</p>
<h3>ARCへの自動変換時はご注意を</h3>
<p>
Xcodeの各バージョンとARC対応の有無によるデフォルト属性の違いは上にまとめたとおりです。最後に、これに伴うXcodeの変更で最も大きい（かつ、場合によってはかなり危険）と思ったことです。
</p>
<p>
Xcode 4.2以降では、非ARCのコードをARCに対応させるための自動変換機能を利用できます。これは、Xcodeのメニューから、&#8221;Edit->Refactor->Convert to Objective-C ARC&#8230;&#8221;を選択することで実行可能です。
</p>
<p>
この自動変換によるプロパティ属性の置き換え方法が、大きく変更されています。Xcode 4.2では、retainプロパティはstrongプロパティに置き換わりました。つまり、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, retain) NSString *string;
</pre>
<p>は、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, strong) NSString *string;
</pre>
<p>に置き換わります。
</p>
<p>
これが、Xcode 4.3では、属性指定なしの宣言に置き換わるようになりました。つまり、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, retain) NSString *string;
</pre>
<p>は、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic) NSString *string;
</pre>
<p>に置き換わります。
</p>
<p>
Xcode 4.3ではデフォルト属性がstrongですので、この変換は、Xcode4.2での変換と全く同じ意味を持ちます。したがって、変換自体は正しく行われていることになります。何が問題かと言うと、<strong>Xcode 4.3で自動変換したコードをXcode 4.2でビルドしようと思ってもエラーになってビルドできない</strong>ということです。
</p>
<p>
みなさま、はまらないようにご注意ください。せめて自動変換のときくらいはstrongつけてほしい気もしますね。。
</p>
<p>
なお、ここで使っているXcode 4.3はMac App Storeよりダウンロードした公式バージョンです(Build 4D502)。iOSSDK 5.1がついているベータバージョンではありません。
</p>
<p>
質問、間違いの指摘などはツイッターでお願いします。<a href="twitter.com/natsun_happy" target="_blank">@natsun_happy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2012/03/default-attribute-change.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2012年の目標</title>
		<link>http://blog.natsuapps.com/2012/01/2012-target.html</link>
		<comments>http://blog.natsuapps.com/2012/01/2012-target.html#comments</comments>
		<pubDate>Mon, 30 Jan 2012 14:53:43 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=1004</guid>
		<description><![CDATA[早いもので、あっという間に2012年も1ヶ月が過ぎましたね。そろそろ今年もまた恒例の、一年の目標を掲げてみます。 とは言え、今年はプライベートに色々と変化がありそうなので、開発の方は少しスローペースになるかもしれません。 <a href='http://blog.natsuapps.com/2012/01/2012-target.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
早いもので、あっという間に2012年も1ヶ月が過ぎましたね。そろそろ今年もまた恒例の、一年の目標を掲げてみます。
</p>
<p>
とは言え、今年はプライベートに色々と変化がありそうなので、開発の方は少しスローペースになるかもしれません。そんな中でも、来年、再来年につなげていけるような一年にしていきたいと思っています。
</p>
<h3>教育アプリ（ゲーム）のリリース</h3>
<p>
昨年一年間、ずいぶんと力を入れてきた新アプリの開発。2011年の反省でも少し触れましたが、現在、<a href="http://twitter.com/mat_jp/" target="_blank">@mat_jp</a>さんと一緒に、楽しみながら学べる教育アプリを開発中です（iPad用）。
</p>
<p>
教育カテゴリもゲームもどちらも初めてで、分からないことだらけで始めた開発ですが、アプリ作りをとても楽しませてもらっています。
</p>
<p>
とにかく、まずはこれを形にします。
</p>
<h3>iLoan Calcアップデート</h3>
<p>
ご好評いただいているローン計算アプリiLoan Calc（<a href="http://www.natsuapps.com/iloan_calc/" target="_blank">サポートサイト</a>）。すでに基本的な機能は十分そろっていますが、少しずつでも小さな改善をしていきたいと思っています。
</p>
<p>
具体的なアップデート内容は現在検討中ですが、4〜5ヶ月に一度のアップデートを目指していきます。
</p>
<h3>情報発信（ブログ更新）</h3>
<p>
ブログはこれまでどおり更新していきたいです。昨年、週1回更新という目標をたてましたが、なかなか難しいということがわかりました。
</p>
<p>
それにもめげずに、今年もできるだけ週1回ペースを守っていけるようにしたいと思います（と言いつつ、これが今年初の記事ですが・・・）。 </p>
<h3>技術力アップ</h3>
<p>
毎年のことですが、ベース力を維持、向上していくのは絶対不可欠。
</p>
<p>
今年は開発のペースこそ落ちるかもしれませんが、新しいOSやデバイスに取り残されないよう、常にアンテナを張って技術力を高めていきたいと思っています。
</p>
<p>
去年に引き続き、本や公式ドキュメント、英語ブログなどを読んで力を付けていきたいです。
</p>
<p>
iOS 5になって公式ドキュメントもかなり更新されています。まだまだ読み切れていないものが多いので、こちらもチェックしていく予定です。
</p>
<h3>新規アプリの開発</h3>
<p>
今、自分が欲しいアプリが二つあります。まずは、これらを自分のために形にしてみて、自ら使ってみることで機能のブラッシュアップなどができればと思っています。
</p>
<p>
どこまでできるか分かりませんが、来年、再来年につながる大事な一年として、無駄なく過ごしていければと思っています。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2012/01/2012-target.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011年を振り返って</title>
		<link>http://blog.natsuapps.com/2011/12/2011-review.html</link>
		<comments>http://blog.natsuapps.com/2011/12/2011-review.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 15:54:57 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=1001</guid>
		<description><![CDATA[今年もまたこの季節がやってきました。すでにiTunes Connectも休暇に入ったことですし、本当に残すところわずかですね。今年1月に一年の目標を掲げました（]]></description>
			<content:encoded><![CDATA[<p>
今年もまたこの季節がやってきました。すでにiTunes Connectも休暇に入ったことですし、本当に残すところわずかですね。今年1月に一年の目標を掲げました（<a href="http://blog.natsuapps.com/2011/01/2011_3135.html"">2011年の目標</a>）。全体の達成度はというと、65%くらいでしょうか。若干、方向性が変わってきていますが、一つずつ振り返ってみたいと思います。
</p>
<h3>iLoan Calcの展開：80%</h3>
<p>
このような目標をたてていました。</p>
<ol>
<li>3ヶ月に1回のアップデート</li>
<li>iLoan Calc for iPadリリース</li>
<li>iLoan Calc for Androidの開発??</li>
</ol>
<p>アップデートに関しては、今年は結構頑張りました。2月にバージョン3.1をリリースし、続けて3.1.1, 3.1.2, 3.1.3と少しずつ機能を強化。その後、7月に念願だったiPad対応（ユニバーサル化）を果たしました（バージョン4.0, 4.0.1）。最後は12月に4.1, 4.1.1をリリース。こちらは小さな機能追加です。
</p>
<p>
3ヶ月に1回という頻度こそなかなかキープすることはできませんでしたが、リリース回数、そして、iPad対応ができたことに関しては、満足しております。
</p>
<p>
最後のAndroid対応ですが、こちらは色々思うことがあり、今の段階では見送ることにしました。
</p>
<p>
その他、不動産業者さんや住宅販売業者さんから、何件かiLoan Calcを自社専用にカスタマイズして欲しいという依頼をいただいたのですが、残念ながらこちらはお断りすることになりました。実現できれば面白いことができそうだとは思ったのですが、開発リソースの問題やその他個人的な事情によりお断りせざるを得ませんでした。非常に残念です。
</p>
<h3>新規アプリケーション開発：50%</h3>
<p>
目標は、最低1本は新しいアプリをリリースする、でした。が、残念ながら今年は1本もリリースできませんでした。
</p>
<p>
とは言え、何もやっていなかったわけではなく、ただいま教育ゲームに奮闘中です。@mat_jpさんと一緒に企画中で、開発は主に私が担当しています。長い目で見てじっくりと検討しながら進めているため時間がかかっていますが、あと一息のところまできています。
</p>
<p>
来年前半にはリリースできるでしょう。
</p>
<p>
ということで、達成度は50%としました。簡単にサクッと1本作ってしまうのもいいですが、こうして色々悩みつつじっくり作っていくのもまた楽しいですね。
</p>
<h3>技術力アップ：80%</h3>
<p>
週4日以上、好きな本やドキュメントなどを読む、という目標をたてました。なかなか毎日継続するのは大変ですね。平均したら週3回くらいだったように思いますが、今年は、多くの新しいことを勉強しました。
</p>
<p>
特に、ゲーム開発を始めたこともあり、まったく未知だったゲームの世界について勉強したことが有意義でした。また、後半にきて一番大きかったのはiOS 5でしょうか。変更内容がかなり大きかったため、こちらは継続して勉強中です。
</p>
<p>
読んで面白かったと思う本をいくつかご紹介。リンクはブログ内の書評ページまたはAmazon.co.jp（書評がないもの）です。
</p>
<h4>ゲーム開発</h4>
<ul>
<li><a href="http://blog.natsuapps.com/2011/07/books-on-opengl-for-ios.html" target="_blank">Books on OpenGL for iOS 良書をまとめてご紹介</a></li>
<li><a href="http://blog.natsuapps.com/2011/05/beginning-math-and-physics-for-game-programmers.html" target="_blank">基礎からしっかりと [書評]ゲーム開発のための数学・物理学入門</a></li>
<li><a href="http://blog.natsuapps.com/2011/05/cocos2d-for-iphone-099-beginners-guide.html" target="_blank">Cocos2d for iPhone 0.99 Beginner’s Guide</a></li>
</li>
<li><a href="http://www.amazon.co.jp/gp/product/1430225998/ref=as_li_ss_tl?ie=UTF8&#038;tag=natsunhappy-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=1430225998">Beginning iPhone Games Development</a> (Amazon.co.jp)</li>
</ul>
<h4>iOS開発一般</h4>
<ul>
<li><a href="http://blog.natsuapps.com/2011/05/ios-ios-automatism-by-the-patterns.html" target="_blank">確実な設計を！ [書評] iOS開発におけるパターンによるオートマティズム</a></li>
<li><a href="http://blog.natsuapps.com/2011/04/ios-2.html" target="_blank">iOS開発者として読む「人月の神話」</a></li>
</ul>
<p>
また、購読している英語ブログが増えました。中でもお気に入りのものをいくつかご紹介します。</p>
<ul>
<li><a href="http://www.raywenderlich.com/" target="_blank">RAYWENDERLICH</a> : チュートリアルが分かりやすくて素晴らしい。特にiOS 5のチュートリアルではかなりお世話になっています。</li>
<li><a href="http://iOSDeveloperTips.com/" target="_blank">[iOS developer:tips];</a> : Tipsやオープンソースの紹介など。</li>
<li><a href="http://www.mikeash.com/pyblog/" target="_blank">mikeash.com: NSBlog</a> : CocoaやObjective-Cの詳細がメイン。</li>
<li><a href="http://maniacdev.com/" target="_blank">ManiacDev.com</a> : チュートリアルやオープンソースの紹介など。</li>
</ul>
<h3>情報発信：70%</h3>
<p>今年は、自分一人で勉強するだけではなく、それらの内容を発信していける年にしたいと思っていました。そのひとつとして、1週間に1回のブログ更新、という目標がありました。</p>
<p>
1週間に1回。私にとっては、できそうでできない数字でした。特に、技術的な内容を記事にしようとすると、詳細を調べたりサンプルプロジェクトを作って検証してみたりと、意外と時間がかかり大変です。
</p>
<p>
今年すべてのブログ更新回数は40回。そのうち開発関連の内容は29回でした。来年はもう少し頑張っていきたいな。
</p>
<h3>ライフプランニングの勉強：60%</h3>
<p>
金利、保険、ローンあたりの本を何冊か読みました。
</p>
<p>
iLoan Calcの機能として、ローンだけではなくクレジットの試算も可能にするかなど、いくつか検討しました。その際、金利に関する以下の2冊が役立ちました（リンクAmazon.co.jp）。</p>
<ul>
<li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/476500970X/natsunhappy-22/ref=nosim" target="_blank">プロが教える!金融商品の数値・計算メカニズム―金利・債券・ローン・投資の計算をエクセルでらくらく理解</a></li>
<li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4765008347/natsunhappy-22/ref=nosim" target="_blank">定本・金利計算マニュアル―利回り感覚錬磨のための72章</a></li>
</ul>
<p>
また、ローンについては、淡河氏のウサギとカメの本がお気に入りです。資金計画について非常にわかりやすく解説されています。</p>
<ul>
<li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4767811198/natsunhappy-22/ref=nosim" target="_blank">ウサギのローン カメのローン 最高の住宅ローンを選ぶ方法</a></li>
</ul>
<p>書評）<a href="http://blog.natsuapps.com/2011/04/blog-post_28.html" target="_blank">資金計画なくしてローン選びはできない！ [書評] ウサギのローン カメのローン〜最高のローンを選ぶ方法</a>
</p>
<p>
他には、ちょっと気になった記事があったのでこんな分析もしてみました。<br />
<a href="http://blog.natsuapps.com/2011/08/lifeplan_for_myhome.html" target="_blank">30代サラリーマンの住宅購入は本当に危険か？ シミュレーション結果を分析</a>
</p>
<p>
ライフプランニングの勉強をする、という漠然とした目標でしたが、自分なりにアンテナをはって意識していられたのではないかと思っています。ただ、具体的な成果がないので達成度は60%といったところでしょうか。
</p>
<h3>まとめ</h3>
<p>
なかなか具体的な成果を出すのが難しい一年でしたが、地盤固めはできたのではないかと思っています。年が明けたら新アプリリリースに向けて最終スパートの予定です。
</p>
<p>
ファイナンスに続き、興味のある教育分野でのアプリ開発に関わることができ、非常に充実した一年でした。リリースまではたどり着けませんでしたが、ここに至るまでの過程で得たものは大きいのではないかと思っています。
</p>
<p>
また、お受けすることはできませんでしたが、アプリ開発の依頼をしてきてくださった方々に、この場を借りて改めて感謝いたします。興味を持っていただいたこと、非常に嬉しく思います。
</p>
<p>
来年はどんな一年になるのでしょうか。今年の成果をうまく繋げていきたいものですね。
</p>
<p>
では皆様、良いお年を。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/12/2011-review.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] UITableViewCellの背景色が変更されている！</title>
		<link>http://blog.natsuapps.com/2011/12/ios5-uitableviewcell-backgroundcolor.html</link>
		<comments>http://blog.natsuapps.com/2011/12/ios5-uitableviewcell-backgroundcolor.html#comments</comments>
		<pubDate>Wed, 07 Dec 2011 09:02:59 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[UITableView]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=1000</guid>
		<description><![CDATA[iOS 5でこっそりと変更になっていたことに気がついたことのひとつとして、UITableViewCellのデフォルト背景色があります。 背景色が変更された！ UITableViewCellをinitWithStyle:で <a href='http://blog.natsuapps.com/2011/12/ios5-uitableviewcell-backgroundcolor.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
iOS 5でこっそりと変更になっていたことに気がついたことのひとつとして、UITableViewCellのデフォルト背景色があります。
</p>
<h3>背景色が変更された！</h3>
<p>
UITableViewCellをinitWithStyle:で作成すると、iOS 4までは背景が白(R:1.0, G:1.0, B:1.0)のセルが作成されていました。
</p>
<p>
ところが！
</p>
<p>
iOS 5では、なんと真っ白ではないのです。背景色は(R:0.97, G:0.97, B:0.97)となっていました。びっくり。
</p>
<h3>カスタムセルを作っている場合には注意が必要</h3>
<p>
背景色が変更になっているため、デフォルトのセル上に別のUILabelなどを乗せて独自のカスタムセルを作っている場合には注意が必要になります。
</p>
<p>
subViewの背景は透過させない方がパフォーマンスがよくなるというので、あえて、背景色を白にしたUILabelを乗せていたのですが、残念なことにOS 5になったらここだけ微妙に色が合っていませんでした。しかも、デバイスの輝度を下げているとなかなか気がつきにくいのでご注意を。
</p>
<h3>対処方法</h3>
<p>
subViewすべての背景を(R:0.97, G:0.97, B:0.97)にすればいいかというと、そうではありませんよね。もちろん、Deploypment TargetがOS5.0以上なら問題ありませんが、OS 4以下もサポートするアプリではそうはいきません。今度は、OS4以下でセルの背景色とsubViewの背景色が合わなくなってしまいます。
</p>
<p>
そんなわけで、カスタムセルのクラス（UITableViewCellのサブクラス）で真面目にsetBackgroundColor:メソッドをオーバーライドしましょう。
</p>
<p><pre class="brush: objc; title: ; notranslate">
- (void)setBackgroundColor:(UIColor *)backgroundColor {
    [super setBackgroundColor:backgroundColor];

    self.mySubView.backgroundColor = backgroundColor;
}
</pre>
</p>
<p>
これで、subViewの背景色はいつでもセルの背景色と一致します。
</p>
<p>
もちろん、OSバージョンを見て背景色を分けてもいいですが、できるだけハードコーディングは減らした方がいいと思うので、setBackgroundColor:メソッドのオーバーライドがお勧めです。
</p>
<p>
これなら、次のバージョンでさらに背景色が変更になってももう心配はいりません。
</p>
<p>
そもそも、最初から真面目に実装していればよかったものの、ちょっと（本当にちょっと・・・）横着をしていました。この横着が、今回のような事態を招いてしまったわけで、これからは気をつけていこうと思います。反省。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/12/ios5-uitableviewcell-backgroundcolor.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] ARC : Autorelease, キャスト, 環境設定</title>
		<link>http://blog.natsuapps.com/2011/11/ios5-arc-autorelease-bridge-xcode.html</link>
		<comments>http://blog.natsuapps.com/2011/11/ios5-arc-autorelease-bridge-xcode.html#comments</comments>
		<pubDate>Wed, 30 Nov 2011 12:19:08 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[メモリ管理]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=999</guid>
		<description><![CDATA[これまでの記事はこちら： [iOS5] ARC (Automatic Reference Counting) : Overview [iOS5] ARC : プロパティ属性と使い方 [iOS5] ARC : Outlet <a href='http://blog.natsuapps.com/2011/11/ios5-arc-autorelease-bridge-xcode.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
これまでの記事はこちら：</p>
<ul>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">[iOS5] ARC (Automatic Reference Counting) : Overview</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-property.html">[iOS5] ARC : プロパティ属性と使い方</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html">[iOS5] ARC : Outletにはweakプロパティを使おう</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html">[iOS5] ARC : 循環参照</a></li>
</ul>
<p>
ARCまとめの最終回はAutoreleaseとキャストについてです。また、最後で簡単にですが、Xcodeの環境設定についても触れます。
</p>
<h3>Autorelease</h3>
<p>
ARC環境下では、これまでのNSAutoreleasePoolは使えません。そうは言っても、別にAutorelease環境がなくなってしまったわけではなく、作法が少し変わったのですね。
</p>
<p>
まずは、参考までにmain.mを見てみましょう。
</p>
<h4>非ARC（マニュアルメモリ管理）</h4>
<p><pre class="brush: objc; title: ; notranslate">
int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
</pre>
</p>
<h4>ARC</h4>
<p><pre class="brush: objc; title: ; notranslate">
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
</pre>
</p>
<p>
ARC環境では、NSAutoreleasePoolを作成する代わりに、@autoreleasepoolブロックが使用されています。
</p>
<p>
@autoreleasepoolブロックの始まりが、NSAutoreleasePoolオブジェクトの生成で、ブロックの終了が、NSAutoreleasePoolオブジェクトの解放だと思えばよいでしょう。
</p>
<p>
@autoreleaseを使うと、ブロック内で生成されたautoreleaseオブジェクトは、すべてブロックの終了とともに解放されます。
</p>
<p>
なお、@autoreleasepoolブロックは、ARC, 非ARCに関係なく使用できるようです。
</p>
<h3>Bridged Cast</h3>
<p>
これまで、(void *)と(id)間のキャスト（CとObjective-C間のキャスト）はそのまま記述できていましたが、ARC環境下では、明示的にオーナーシップの所在を明らかにする必要があります。これは、Objective-CのオブジェクトとCore Foundationのオブジェクト間のキャスト（Toll-Free bridgedが可能なもの）でも同様です。
</p>
<h4>Toll-Free Bridgedとは</h4>
<p>
Toll-Free Bridgedとは、NSArrayとCFArrayRef, NSStringとCFStringRefのように、オブジェクト構造が同じためにそのままキャストが可能なものを言います。
</p>
<p>
※ Toll-Free Bridgedのオブジェクト一覧は、<br />
<a href="http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html" target="_blank">Core Foundation Design Concepts &#8211; Toll-Free Bridged Types</a><br />
を参照のこと。
</p>
<p>
例えば、非ARC環境では、Toll-Free Bridgedのオブジェクトは、以下のように単純にキャストすることができました。</p>
<pre class="brush: objc; title: ; notranslate">
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (CFStringRef)string;
</pre>
<p>Core Foundationの関数にObjective-Cのオブジェクトを引数として渡すときも同様です。
</p>
<h4>ARC環境ではコンパイルエラー</h4>
<p>
しかし、上記のようなコードは、ARC環境ではコンパイルエラーとなります。<br />
&#8220;Cast of Objective-C pointer type &#8216;NSString *&#8217; to C pointer type &#8216;CFStringRef&#8217; (aka &#8216;const struct __CFString *&#8217;) requires a bridged cast&#8221;
</p>
<p>
エラー内容を見てみると、bridged castが必要だと言っています。さらに、コンパイラが親切に修正例も教えてくれています。候補は二つあって、<br />
&#8220;Use __bridge to convert directly (no change in ownership)&#8221;<br />
&#8220;Use __bridge_retained to make an ARC object available as a +1 &#8216;CFStringRef&#8217; (aka &#8216;const struct __CFString *&#8217;)&#8221;<br />
です。
</p>
<p>
オーナーシップ権を変更しないのなら、__bridgeを使い、CFStringRefの方でretainカウントを+1したければ、__bridge_retainedを使いなさいということですね。
</p>
<p>
Objective-CオブジェクトがARCの対象であるのに対し、Core FoundationオブジェクトはARCの対象ではありません。したがって、これらの間でキャストをする際には、コンパイラにオーナーシップ権をどうすべきか指示する必要があるというわけです。
</p>
<h4>3つのbridgeタイプ</h4>
<p>
Bridgeタイプには上述した__bridge, __bridge_retainedの他にもう一つ、__bridge_transferというものがあります。
</p>
<h5>__bridge</h5>
<p><pre class="brush: objc; title: ; notranslate">
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (__bridge CFStringRef)string;
</pre>
<p>単純なキャストを行うときに使用します。オーナーシップ権は移行しませんので、キャスト元の変数（上の例ではstring）が破棄された（スコープ外に出るなど）あとでの、キャスト先の変数（cfString）の使用は非常に危険です。
</p>
<h5>__bridge_retained</h5>
<p><pre class="brush: objc; title: ; notranslate">
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (__bridge_retained CFStringRef)string;
...
CFRelease(cfString); // Core FoundationはARC対象外なので自分でreleaseする。
</pre>
<p>キャストと同時に、キャスト先の変数（cfString）のretain countが+1されます。これにより、キャスト元の変数（string）が破棄されたあとでも、安全にキャスト先の変数を使用することができます。ただし、上記のようにObjective-CからCore Foundationにキャストした場合、Core FoundationがARC対象外なので、最終的に自分でcfStringをreleaseして上げる必要があります。
</p>
<p> __bridge_retainedキャストを用いる代わりに、CFBridgingRetain()関数を利用することもできます。</p>
<pre class="brush: objc; title: ; notranslate">
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = CFBridgingRetain(string);
...
CFRelease(cfString); // Core FoundationはARC対象外なので自分でreleaseする。
</pre>
</p>
<h5>__bridge_transfer</h5>
<p>
オーナーシップ権が移行されます。キャストと同時に、キャスト元の変数はreleaseされ、キャスト先の変数がretainされると考えればよいでしょう。__bridge_transferは、Core FoundationオブジェクトをObjective-Cオブジェクトにキャストするときによく利用されると思います。</p>
<pre class="brush: objc; title: ; notranslate">
CFStringRef cfString = CFStringCreate...();
NSString *string = (__bridge_transfer NSString *)cfString;

// CFRelease(cfString); __bridge_transferを使ったのでreleaseは不要！！
</pre>
</p>
<p>
__bridge_transferキャストを用いる代わりに、CFBridgingRelease()関数を利用することもできます。このコードだと、CFReleaseが不要な理由が明らかでしょう。</p>
<pre class="brush: objc; title: ; notranslate">
CFStringRef cfString = CFStringCreate...();
NSString *string = CFBridgingRelease(cfString);
</pre>
</p>
<h4>キャストのタイプを決めるポイント</h4>
<p>
キャストのタイプを決めるときは、</p>
<ul>
<li>キャスト元、先のどちらがARC対象でどちらがARC非対象か</li>
<li>ARC対象外のオブジェクトのreleaseは誰がすべきか</li>
<li>それぞれのオブジェクトの生存範囲はどこか（ARCの場合スコープ外に出れば破棄される）</li>
</ul>
<p>あたりをポイントに考えると分かりやすいと思います。
</p>
<h3>Xcodeの環境設定</h3>
<p>
最後になりましたが、簡単にXcodeの環境設定についてです。
</p>
<p>
非ARCの旧プロジェクトをARCに対応させたい場合、Xcodeのメニューから&#8221;Edit&#8221;->&#8221;Refactor&#8221;->&#8221;Convert to Objective-C ARC&#8230;&#8221;を選択すればOKです。最初にコンパイラがプレチェックをして、問題なければ移行できます。
</p>
<p>
なお、このとき、ARCに変換したいコードを選択可能ですので、非ARCのまま残しておきたいコードは対象コードのチェックを外しましょう。
</p>
<p>
また、プロジェクトのターゲット設定で、&#8221;Build Phases&#8221;->&#8221;Compile Sources&#8221;の&#8221;Compiler Flags&#8221;に&#8221;-fno-objc-arc&#8221;が追加されているコードはARCの対象外となります。外部ライブラリを使用している場合など、自分ではコントロールしきれないものはARCの対象から外しておくと便利だと思います。
</p>
<p>
ちなみに、Refactorのプレチェックは、まだまだおかしなエラーも出ることがあるようです。何度もやると結果が違うので、このあたりはまだ試行錯誤が必要かもしれません。
</p>
<p>
プレチェック時に出るエラーに関しては、以下のチュートリアルの最後にあるMigration Woesが参考になります。<br />
<a href="http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1" target="_blank">Beginning ARC in iOS 5 Tutorial Part 1 | Ray Wenderlich</a>
</p>
<h3>まとめ</h3>
<p>
少し駆け足になりましたが、Autorelease、キャストと、Xcodeの環境設定についてまとめました。これで、以前の記事も合わせると、ARCに関しては大まかですが一通り理解できたことになります。
</p>
<p>
最初は少し取っ付きにくい部分がありますが、慣れてしまえばかなり使いやすいと思います。何よりもコード量が減るのがありがたいですね。
</p>
<p>
ARCを使うことで、不正アクセスによるクラッシュなどはずいぶん減らせるのではないでしょうか。ただし、循環参照やキャストに気をつけないとメモリリークは減りません。むしろ増えてしまうかもしれないので注意しましょう。
</p>
<p>
質問、間違いの指摘などはツイッターでお願いします。<a href="twitter.com/natsun_happy" target="_blank">@natsun_happy</a>
</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html" target="_blank">Transitioning to ARC Release Notes | iOS Developer Library</a></li>
<li><a href="http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html" target="_blank">Core Foundation Design Concepts &#8211; Toll-Free Bridged Types | iOS Developer Library</a></li>
<li><a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" target="_blank">Objective-C Automatic Reference Counting (ARC) | The LLVM Compiler Infrastructure</a></li>
<li><a href="http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1" target="_blank">Beginning ARC in iOS 5 Part1 | Ray Wenderlich</a></li>
<p><a href="http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2" target="_blank">Beginning ARC in iOS 5 Part2 | Ray Wenderlich</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/11/ios5-arc-autorelease-bridge-xcode.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] ARC : 循環参照</title>
		<link>http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html</link>
		<comments>http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html#comments</comments>
		<pubDate>Fri, 25 Nov 2011 13:27:50 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[メモリ管理]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=998</guid>
		<description><![CDATA[これまでの記事はこちら： [iOS5] ARC (Automatic Reference Counting) : Overview [iOS5] ARC : プロパティ属性と使い方 [iOS5] ARC : Outlet <a href='http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
これまでの記事はこちら：</p>
<ul>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">[iOS5] ARC (Automatic Reference Counting) : Overview</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-property.html">[iOS5] ARC : プロパティ属性と使い方</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html">[iOS5] ARC : Outletにはweakプロパティを使おう</a></li>
</ul>
<h3>循環参照とは</h3>
<p>
今回は、強参照（Strong reference）を使うときに注意したい循環参照（Strong reference cycle）についてです。循環参照とは、その名の通り、2つ以上のオブジェクトが強参照し合うことにより、どちらのオブジェクトも破棄できない状態を言います。
</p>
<p>
ここで、循環参照が発生するのは、お互いに&#8221;<strong>強参照</strong>&#8220;しているときです。複数のオブジェクトが親子関係を持つ場合を考えてみます。
</p>
<p>
アドレス帳オブジェクトAddrBookと、そのエントリーEntryがあるとします。AddrBookはEntryオブジェクトのentryを、Entryは、自身がどのアドレス帳に含まれているかを示すAddrBookオブジェクトaddrBookを持ちます。
</p>
<p>
このとき、もし、entryもaddrBookも強参照だと循環参照が発生します。
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/arc_reference_cycle.png" alt="ARC strong reference cycle" title="arc_reference_cycle.png" border="0" width="434" height="180" style="float:left;" />
</p>
<p><br style="clear:both" /></p>
<p>
この場合、Entryオブジェクトは、AddrBookから強参照されているので、破棄されません。一方で、Entryオブジェクトが破棄されないと、AddrBookオブジェクトへの強参照もなくならないため、こちらも破棄されないことになります。
</p>
<h3>弱参照を使って解決</h3>
<p>
このように、複数オブジェクトが親子関係を持つ場合には、片方を弱参照にすることで循環参照を回避することができます。一般的には、親オブジェクトが子オブジェクトのオーナーとなり（強参照し）、子オブジェクトは、親オブジェクトを弱参照するのみとします。
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/arc_reference_cycle_2.png" alt="ARC avoid strong reference cycle" title="arc_reference_cycle_2.png" border="0" width="434" height="180" style="float:left;" />
</p>
<p><br style="clear:both" /></p>
<p>
これであれば、AddrBookオブジェクトを強参照している変数がなくなれば、AddrBookオブジェクトは破棄され、それと同時にEntryオブジェクトへの強参照もなくなります。
</p>
<p>
また、先にAddrBookオブジェクトが破棄された場合でも、EntryオブジェクトのaddrBook変数にはZeroingによりnilが代入されますので、破棄済みオブジェクトにアクセスしてクラッシュするような心配もありません。
</p>
<h3>Delegateパターンの場合</h3>
<p>
Cocoaではよく使われるdelegateパターンですが、ここでも循環参照を避けるために弱参照を使う必要があります。
</p>
<p>
ViewControllerから、DetailViewControllerをModalViewなどで開く場合、DetailViewControllerを閉じる動作を決めるために、delegateを設定することがよくあります。
</p>
<p><img src="http://blog.natsuapps.com/wp-content/uploads/arc_reference_cycle_delegate.png" alt="ARC delegate pattern" title="arc_reference_cycle_delegate.png" border="0" width="532" height="105" style="float:left;" /></p>
<p><br style="clear:both" /></p>
<p>
ここで、ViewControllerがdetailViewControllerを強参照している場合、delegateを弱参照にしないと循環参照が発生します。そもそも、delegateは、親となるViewControllerが存在しなくなった時点で意味をなさなくなるので、弱参照が適しているはずです。
</p>
<p>
なお、自分で作成したクラスのdelegateにweakプロパティを使っている場合、Zeroingにより、参照先が破棄されたら自動的にnilがセットされますので、わざわざ自分でnilをセットしなくても問題ありません。
</p>
<h3>Blocksの場合</h3>
<p>
Blockも一つのオブジェクトだと考えられます。Blockによるキャプチャに注意しておかないと、ここでも循環参照が発生します。
</p>
<p>
Blockへのcopyプロパティを持つMyObjectを例に考えてみます。</p>
<pre class="brush: objc; title: ; notranslate">
typedef void(^MyBlock)(void);

@interface MyObject : NSObject
@property (nonatomic, copy) MyBlock block;
@property (nonatomic, strong) NSString *str;

- (void)performBlock;
@end
</pre>
<pre class="brush: objc; title: ; notranslate">
@implementation MyObject
@synthesize block, str;

- (void)performBlock {
    if (self.block) {
        self.block();
    }
}
@end
</pre>
</p>
<p>
呼び出し側では以下のようにしたとします。
</p>
<p><pre class="brush: objc; title: ; notranslate">
MyObject *object = [[MyObject alloc] init];
object.str = @&quot;hoge&quot;;

object.block = ^{
    NSLog(@&quot;block: str=%@&quot;, object.str);
};
[object performBlock];
</pre>
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/arc_reference_cycle_blocks.png" alt="ARC strong reference cycle blocks" title="arc_reference_cycle_blocks.png" border="0" width="241" height="186" style="float:left;" />
</p>
<p>
Block構文の中でobjectを参照しています。したがって、object.blockは、objectをキャプチャし保持します。これにより、objectがblockを強参照し、blockがobjectを強参照することになります。これが、Blockによる循環参照です。
</p>
<p><br style="clear:both" /></p>
<h4>解決方法 その1: __block修飾子を使う</h4>
<p>
Blockによる循環参照を回避する方法はいくつかありますが、その一つ目は、Block内で、処理が終了したらobjectを解放する方法です。そのためには、__block修飾子を使用して、objectを読み書き可能にする必要があります。
</p>
<p>
なお、ARC以前では、__block変数はキャプチャされませんでしたが、ARCの場合挙動が違います。__block変数が持つ意味は、Block内で読み書き可能となるだけで、キャプチャに関しては通常の変数と変わりません。
</p>
<p><pre class="brush: objc; highlight: [1,6]; title: ; notranslate">
__block MyObject *object = [[MyObject alloc] init];
object.str = @&quot;hoge&quot;;

object.block = ^{
    NSLog(@&quot;block: str=%@&quot;, object.str);
	object = nil;
};
[object performBlock];
</pre>
</p>
<p>
これで、blockがobjectの強参照をやめるため、循環参照が解消されます。しかしながら、この方法には一つ欠点があります。objectの解放がBlock内で行われているため、Blockが実行されないと循環参照したままとなります（上記コードで、[object performBlock];をコメントアウトすると循環参照します）。
</p>
<h4>解決方法 その2: __weak修飾子を使う</h4>
<p>
もう一つの解決方法です。この方法では、Block内からの参照に弱参照を使います（キャプチャされるのはweak変数）。
</p>
<p><pre class="brush: objc; highlight: [4,6]; title: ; notranslate">
MyObject *object = [[MyObject alloc] init];
object.str = @&quot;hoge&quot;;

__weak MyObject *weakObject = object;
object.block = ^{
    NSLog(@&quot;block: str=%@&quot;, weakObject.str);
};
[object performBlock];
</pre>
</p>
<p>
これだと、blockが参照しているweakObjectは弱参照ですので、循環参照は発生しません。
</p>
<p>
さらに、この方法をもう少し安全にしたのが以下です。</p>
<pre class="brush: objc; highlight: [6,8]; title: ; notranslate">
MyObject *object = [[MyObject alloc] init];
object.str = @&quot;hoge&quot;;

__weak MyObject *weakObject = object;
object.block = ^{
	MyObject strongObject = weakObject;
	if (strongObject) {
	    NSLog(@&quot;block: str=%@&quot;, strongObject.str);
	}
};
[object performBlock];
</pre>
<p>ここで例にあげたようなシンプルな実装ではここまでする必要はありませんが、非同期でBlocksを使う場合など、weak変数であるweakObjectがnilになってしまう可能性があります。したがって、一度、strong変数として保持しておき、nilチェックを行うということです。
</p>
<h4>注意: キャプチャされるのは str ではなく object </h4>
<p>
今回、あえてBlock内で使う変数をobject.strとしてみました。ここで注意が必要なのは、キャプチャされるのは、strではなく、objectそのものだということです。
</p>
<p>
したがって、仮にMyObjectがNSInteger型のvalueというプロパティを持っていたとして、Block内でobject.valueを利用しても結果は同じです。
</p>
<p>
Blocksを利用する場合には、Block内で利用している変数とインスタンス変数との関係をよく考えて、循環参照が起きないように注意しましょう。
</p>
<h3>まとめ</h3>
<p>
個人的には、ARCの利用で一番怖いかなと思っている循環参照についてまとめました。循環参照していても気がつきにくいので、知らないうちにメモリリークして悲しい事態にならないよう、実装時には細心の注意を払いたいものです。
</p>
<p>
質問、間違いの指摘はツイッターでお願いします。<a href="twitter.com/natsun_happy" target="_blank">@natsun_happy</a>
</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-1000810" target="_blank">Advanced Memory Management Programming Guide : iOS Developer Library</a></li>
<li><a href="http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html" target="_blank">Transitioning to ARC Release Notes : iOS Developer Library</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] ARC : Outletにはweakプロパティを使おう</title>
		<link>http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html</link>
		<comments>http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html#comments</comments>
		<pubDate>Mon, 21 Nov 2011 08:19:50 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[メモリ管理]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=992</guid>
		<description><![CDATA[今回は、ARCを用いた場合のプロパティ利用に関するTipsです。 ARCって何？と言う方は、まずはこちらからどうぞ。 [iOS5] ARC (Automatic Reference Counting) : Overvie <a href='http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
今回は、ARCを用いた場合のプロパティ利用に関するTipsです。
</p>
<p>
ARCって何？と言う方は、まずはこちらからどうぞ。</p>
<ul>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">[iOS5] ARC (Automatic Reference Counting) : Overview</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-property.html">[iOS5] ARC : プロパティ属性と使い方</a></li>
</ul>
<p></small>
</p>
<h3>一般的なOutletにはweakプロパティを使う</h3>
<p>
Interface Builderなどを用いて作成したOutletは、一般的に別のview（例えばUIViewControllerのviewなど）のsubviewであることがほとんどです。したがって、これらのOutletのオーナーとなるのはsuperviewのみで十分だと言えます。
</p>
<p>
ViewControllerは、自身がOutletのオーナーになる必要がないので、この場合、weakプロパティの利用が適しています。
</p>
<p>
もちろん、UIViewControllerのviewや、UIWindowのwindowなど、トップレベルのviewに関してはstrongプロパティを使う必要がありますが、自分でこれらのOutletを設定することはまれでしょう。
</p>
<p>
weakプロパティを使うことで、不要な循環参照 (Strong reference cycle) を避けることができます。
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/arc_outlet_weak_property.png" alt="ARC: weak property is used for IBOutlet" title="arc_outlet_weak_property.png" border="0" width="564" height="402" style="float:left;" />
</p>
<p><br style="clear:both" /></p>
<h3>viewDidUnloadの簡略化</h3>
<p>
Outletにweakプロパティを利用することには、もう一つ大きなメリットがあります。
</p>
<p>
メモリ不足が検知されたとき、viewが表示されていないUIViewControllerはすべてのview（自身のviewだけではなくsubviewもすべて）をunloadします。そのためviewDidUnloadが呼ばれるのですね。
</p>
<p>
したがって、もしstrongプロパティを使っていた場合、このタイミングで必ずオブジェクトを解放する（参照をやめる）必要があります。つまり、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, strong) IBOutlet UILabel *label;
</pre>
<p>に対しては、viewDidUnload内で必ず、</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidUnload {
	self.label = nil; // nilをセットして参照をやめる（オーナーシップ権を破棄）
	[super viewDidUnload];
}
</pre>
<p>としてあげる必要があるということです。
</p>
<p>
ここでもし、<em>self.label = nil</em> の処理を忘れてしまうと、UIViewControllerがlabelオブジェクトをいつまでも参照してしまい、結果としてlabelオブジェクトは破棄されません。せっかくシステムがunloadしてくれて、誰からも利用されていない状態なのに、そのオブジェクトを保持し続けてしまうのです。画面数が多いアプリでこれをやってしまったら、memory warningが上がっても不要なviewが解放されずにいつまでもメモリに空きが出ないでしょう。
</p>
<p>
しかし、weakプロパティを使っている場合、この処理は不要です。</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, weak) IBOutlet UILabel *label;
</pre>
<p>この場合、システムがlabelオブジェクトをunloadした時点で、このオブジェクトはもう誰からも強参照されなくなります。したがって、ARCのルールに則りlabelオブジェクトはここで破棄されます。もちろん、破棄された時点でlabel変数にはnilが代入されます（__weak変数は、参照際のオブジェクトが破棄されたら自動的にnilが代入されるため）。 </p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidUnload {
	// この時点ですでに、labelにはnilがセットされている
	[super viewDidUnload];
}
</pre>
<p>これであれば、不要にオブジェクトを保持し続けてしまうことを避けられます。
</p>
<p>
viewDidUnloadでの処理がOutletの解放のみだった場合、結果的にviewDidUnloadのオーバーライド自体不要になるわけです。
</p>
<p>
このように、weakプロパティを使うことで、viewDidUnloadの実装を簡略化することができ、ミスによるトラブルを避けることが可能です。
</p>
<h3>strongプロパティを使うべきとき</h3>
<p>
上でも少し触れましたが、例外としてstrongプロパティを使わなくてはいけないこともあります。これは主に、Interface Builder（または、Storyboardの各scene）における、トップレベルのviewやwindowをOutletとして設定するときです。
</p>
<p>
このような場合は、strongプロパティにしておかないと、誰からも強参照されることなくload後に破棄されてしまので注意が必要です。
</p>
<h3>まとめ</h3>
<p>
もちろん、Outletのプロパティとしては、weakでもstrongでも動作可能です。しかしながら、weakプロパティを利用することでケアレスミスによるバグをさらに減らすことが可能です。このように、strong, weakは、状況に応じて使い分けることが重要だということです。
</p>
<p>
次回は、循環参照（Strong reference cycle）についてです。こちらも、strong, weakの使い分けに関する内容です。
</p>
<p>
質問、間違いの指摘などはツイッターでお願いします。<a href="http://twitter.com/natsun_happy" target="_blank">@natsun_happy</a>
</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW18" target="_blank">Resource Programming Guide : Nib Files : Managing the Lifetimes of Objects from Nib Files | iOS Developer Library</a></li>
<li>
<a href="http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2" target="_blank">Beginning ARC in iOS 5 Part2 | Ray Wenderlich</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] ARC : プロパティ属性と使い方</title>
		<link>http://blog.natsuapps.com/2011/11/ios5-arc-property.html</link>
		<comments>http://blog.natsuapps.com/2011/11/ios5-arc-property.html#comments</comments>
		<pubDate>Fri, 18 Nov 2011 09:40:30 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[メモリ管理]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=991</guid>
		<description><![CDATA[前回、ARC OverviewでARC(Automatic Reference Counting)の基本概念と__strong, __weak等の修飾子についてまとめました。今回は、Objective-Cではよく使われる <a href='http://blog.natsuapps.com/2011/11/ios5-arc-property.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
前回、<a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">ARC Overview</a>でARC(Automatic Reference Counting)の基本概念と__strong, __weak等の修飾子についてまとめました。今回は、Objective-Cではよく使われるプロパティについてみていきます。
</p>
<h3>オーナーシップ属性</h3>
<p>
ARC対応により、これまでのセッターに関するプロパティ属性に加えていくつかの属性が追加されました。以下の表が、ARCで有効な属性とそのオーナーシップ（修飾子）との関係です（太字がARCによって追加になったもの）。</p>
<table border="1" bordercolor="#a0a0a0">
<tr>
<td>プロパティ属性</td>
<td>修飾子</td>
<td>オーナーシップ</td>
</tr>
<tr>
<td><strong>strong</strong></td>
<td>__strong</td>
<td>あり</td>
</tr>
<tr>
<td><strong>weak</strong></td>
<td>__weak</td>
<td>なし</td>
</tr>
<tr>
<td>copy</td>
<td>__strong</td>
<td>あり（コピーオブジェクトが代入される）</td>
</tr>
<tr>
<td><strong>unsafe_unretained</strong></td>
<td>__unsafe_unretained</td>
<td>なし</td>
</tr>
<tr>
<td>assign</td>
<td>__unsafe_unretained</td>
<td>なし</td>
</tr>
<tr>
<td>retain</td>
<td>__strong</td>
<td>あり</td>
</tr>
</table>
<p>
</p>
<h4>strong</h4>
<p>
__strong修飾子に対応するプロパティ属性です。strong属性を用いたプロパティは参照先オブジェクトのオーナーとなります。
</p>
<h4>weak</h4>
<p>
__weak修飾子に対応するプロパティ属性です。__weak修飾子を持った変数と同様、weak属性のプロパティも、参照先のオブジェクトが破棄されたら自動的にnilが代入されます。weak属性を用いたプロパティはオーナーシップ権を持ちません。
</p>
<p>
weak属性は、delegateやOutletの変数に最適です。
</p>
<p>
なお、iOS 4では__weak修飾子が使えないため、プロパティのweak属性も使えません。この場合は、後述のunsafe_unretainedを使いましょう。
</p>
<h4>copy</h4>
<p>
__strong修飾子に対応しますが、実際にはコピーオブジェクトが代入されます。copy属性を用いたプロパティは参照先オブジェクトのオーナーとなります。
</p>
<h4>unsafe_unretained</h4>
<p>
__unsafe_unretaind修飾子に対応するプロパティ属性です。iOS 4では、weak属性が使えないため、オーナーシップ権を持たないプロパティを作成したい場合、こちらを利用する必要があります。
</p>
<h4>assign</h4>
<p>
主にスカラー変数（intやBOOLなど）のプロパティ属性として利用されます。
</p>
<p>
オブジェクトに対して使用することも可能ですが、オーナーシップ権を持たないプロパティを作成したい場合、weak(iOS 5以上)もしくはunsafe_unretained(iOS 4を含む)を利用すべきでしょう。
</p>
<h4>retain</h4>
<p>
retain属性も利用することは可能です（strong属性と同じ働きをします）。しかしながら、ARC対応のコードでは、strong属性を使った方が明白でよいでしょう。
</p>
<h3>読み書きに関する属性 (readwrite, readonly)</h3>
<p>
読み書きに関する属性にはreadwriteとreadonlyの二通りが存在します。ARCを利用すると、オブジェクトに対してreadonly属性を用いるときに注意が必要です。
</p>
<p>
これまで、</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, readonly) NSString *name;
</pre>
<p>のような書き方が可能でした。この書き方ではセッターに関する属性（オーナーシップ属性）を指定していませんが、そもそもreadonlyなのでセッターは不要ですから問題がなかったのですね。
</p>
<p>
しかしながら、ARCを利用すると、上記のコードでは以下のようなコンパイラエラーとなります。<br />
&#8220;ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute&#8221;<br />
<br />
ARCでは、オーナーシップ属性のないプロパティは実装できないということです。このコードは、以下のように書き換えることでエラーを回避できます。</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, strong, readonly) NSString *name;
</pre>
<p>実際にはreadonlyプロパティなのでstrongは意味をなしませんが、このように記述する必要があるようです。
</p>
<p>
なお、スカラー値のプロパティはデフォルトとしてassign属性となりますので、あえて明示的にassignを設定しなくても問題はありません。
</p>
<h3>まとめ</h3>
<p>
前回の修飾子に加えて、プロパティ属性についてまとめました。これで、ARCの基本中の基本は抑えたことになります。
</p>
<p>
次回は、プロパティ関連の続きとして、Outletはweak属性を使うと便利だという件についてまとめたいと思います。
</p>
<p>
質問、間違いの指摘などはtwitterでお願いします。<a href="http://twitter.com/natsun_happy/" target="_blank">@natsun_happy</a>
</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html" target="_blank">Transitioning to ARC Release Notes | iOS Developer Library</a></li>
<li><a href="http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1" target="_blank">Beginning ARC in iOS 5 Part1 | Ray Wenderlich</a></li>
<li>
<a href="http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2" target="_blank">Beginning ARC in iOS 5 Part2 | Ray Wenderlich</a></li>
<li><a href="http://www.raywenderlich.com/store/ios-5-by-tutorials" target="_blank">iOS5 By Tutorials Chapter 3: Intermediate ARC (PDF Book by Ray Wenderlich and others)</a></li>
<li><a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" target="_blank">Objective-C Automatic Reference Counting (ARC) | The LLVM Compiler Infrastructure</a></li>
<li><a href="http://www.amazon.co.jp/gp/product/4844331094/ref=as_li_ss_tl?ie=UTF8&#038;tag=natsunhappy-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4844331094">エキスパートObjective-Cプログラミング －iOS/OS Xのメモリ管理とマルチスレッド－</a><img src="http://www.assoc-amazon.jp/e/ir?t=natsunhappy-22&#038;l=as2&#038;o=9&#038;a=4844331094" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/11/ios5-arc-property.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS5] ARC (Automatic Reference Counting) : Overview</title>
		<link>http://blog.natsuapps.com/2011/11/ios5-arc-overview.html</link>
		<comments>http://blog.natsuapps.com/2011/11/ios5-arc-overview.html#comments</comments>
		<pubDate>Wed, 16 Nov 2011 10:40:38 +0000</pubDate>
		<dc:creator>Natsu</dc:creator>
				<category><![CDATA[iOS 開発]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[iOS5]]></category>
		<category><![CDATA[メモリ管理]]></category>

		<guid isPermaLink="false">http://blog.natsuapps.com/?p=990</guid>
		<description><![CDATA[iOS 5では数々の機能が追加されましたが、その中でも開発者の私たちにとって嬉しかったのはARC(Automatic Reference Counting)ではないでしょうか。そこで、ARCの概要から注意点まで、基本的な <a href='http://blog.natsuapps.com/2011/11/ios5-arc-overview.html'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>
iOS 5では数々の機能が追加されましたが、その中でも開発者の私たちにとって嬉しかったのはARC(Automatic Reference Counting)ではないでしょうか。そこで、ARCの概要から注意点まで、基本的なところを何回かに分けてまとめていきたいと思います。
</p>
<h3>ARCとは？</h3>
<p>
ARC (Automatic Reference Counting) とは、その名の通り、自動リファレンスカウンタ。リファレンスカウンタ方式のメモリ管理を自動で（正確にはコンパイラが）行ってくれるというものです。
</p>
<p>
ご存知リファレンスカウンタ方式のメモリ管理では、retain, releaseなどのメソッドを用いて生成したオブジェクトの保持状態を管理しています。ARCを使うことで、これらの管理に必要なコードをコンパイラ(LLVM 3.0)が自動で挿入してくれるという、なんとも便利なものなのです。
</p>
<p>
しかしながら、美しいものには刺があるわけで、ARCも使い方に注意しないと痛い目に合いそうです。しっかりと理解してから使いましょう。
</p>
<h3>retain, release, autorelease, deallocはコンパイラのお仕事</h3>
<p>
ARCを利用する場合、コンパイラが</p>
<ul>
<li>retain, release, autoreleaseを挿入してくれる（自分で呼んではいけない。コンパイラエラーになる）。</li>
<li>deallocを適切な位置に挿入してくれる（deallocのオーバーライドは可能。ただし[super dealloc]は不可能）。</li>
</ul>
<p>ことになります。
</p>
<p>
つまり、ARCを有効にすることで、これまで気にしていたrelease忘れによるメモリリークや、retain忘れによるクラッシュなどを防げるようになるのです。
</p>
<p>
ただし、ARCはガーベージコレクションとは違います。あくまでも、コンパイラが一定のルールに則って適切な場所に適切なコードを入れてくれるものです。したがって、その「ルール」をしっかり把握しておく必要があるのです。
</p>
<h3>オブジェクトの生存状況</h3>
<p>
これまでは、自分が保持しておきたいオブジェクトはretainしていました。ARCではこれは不要（不可能）です。ARCにおけるオブジェクト利用の考え方の基本は、</p>
<ul>
<li>オーナーのいる（強参照されている）オブジェクトは常に利用可能</li>
<li>オーナーがいなくなったら（スコープ外に出た場合も含む）破棄される</li>
</ul>
<p>です。ここで、オーナーとは、あるオブジェクトを強参照している変数のことを指します。
</p>
<p>
なお、「参照」には「強い参照 (strong reference)」と「弱い参照 (weak reference)」があるので注意が必要です。オーナーになれるのは、「強い参照」をしているときのみです。
</p>
<p>
以下で、例にあげて考えてみます。
</p>
<h4>強い参照 (Strong reference)</h4>
<p>
(s1)<br />
まず、firstName変数（修飾子を伴わないものはすべてstrong reference）に&#8221;natsu&#8221;というテキストを入れてオブジェクトを生成します。この時点で、firstNameはNSString型オブジェクト@&#8221;natsu&#8221;を強参照しています。言い換えると、firstNameは@&#8221;natsu&#8221;のオーナーであると言えます。
</p>
<p>
(s2)<br />
次に、同じく強参照のaName変数にfirstNameを代入しました。@&#8221;natsu&#8221;は、firstNameに加え、aNameからも参照されるようになりました。この時点で、@&#8221;natsu&#8221;のオーナーはfirstNameとaNameです。
</p>
<p>
(s3)<br />
次に、firstNameの内容を変更します。新たなオブジェクトを生成し、&#8221;maki&#8221;というテキストをセットしたとしましょう。
</p>
<p>
ここからfirstNameは、新たに生成されたオブジェクト@&#8221;maki&#8221;を参照します。つまり、@&#8221;natsu&#8221;のオーナーではなく、@&#8221;maki&#8221;のオーナーになりました。これで、@&#8221;natsu&#8221;のオーナーは、aNameだけとなりましたが、オーナーが残っているのですから、@&#8221;natsu&#8221;オブジェクトはメモリ上に存在しています。
</p>
<p>
(s4)<br />
新しい変数otherNameにfirstNameを代入しました。@&#8221;maki&#8221;のオーナーが増えています（強参照が増えている）。
</p>
<p>
(s5)<br />
aNameにotherNameを代入します。この時点で、aNameは@&#8221;maki&#8221;を参照するようになり、@&#8221;maki&#8221;のオーナーになります。@&#8221;natsu&#8221;にはオーナーがいなくなりました。したがって、このオブジェクトはここで破棄されます。
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/ARC_outline_strong1.png" alt="ARC outline strong reference" title="ARC_outline_strong.png" border="0" width="528" height="587" style="float:left;" />
</p>
<p><br style="clear:both" /></p>
<h4>弱い参照 (Weak reference)</h4>
<p>
次に、弱い参照 (Weak reference) の場合を見てみます（弱い参照を示す場合、__weak修飾子を使います。詳細は後述）。
</p>
<p>
(w1)<br />
強い参照のときと同様に、firstNameを初期化します。firstNameは@&#8221;natsu&#8221;のオーナーです。
</p>
<p>
(w2)<br />
弱い参照であるweakName変数にfirstNameを代入しました。weakNameは@&#8221;natsu&#8221;を参照していますが、この参照は「弱い参照」です。つまり、weakNameは@&#8221;natsu&#8221;のオーナーではありません。
</p>
<p>
(w3)<br />
firstNameが変更されました。そのため、firstNameは@&#8221;natsu&#8221;のオーナーではなく、新たに生成された@&#8221;maki&#8221;のオーナーとなりました。
</p>
<p>
この時点で、@&#8221;natsu&#8221;は誰からも強参照されなくなりました。すなわち、オーナーがいなくなったのです。そのためこのオブジェクトはここで破棄されます。
</p>
<p>
このとき、weakNameにはnilが代入されます。これは、Zeroingといって弱い参照の特徴です。破棄済みオブジェクトのアドレスが残らないので、不要なクラッシュを避けることができます。
</p>
<p>
<img src="http://blog.natsuapps.com/wp-content/uploads/ARC_outline_weak1.png" alt="ARC outline weak" title="ARC_outline_weak.png" border="0" width="530" height="412" style="float:left;" />
</p>
<p><br style="clear:both" /></p>
<h3>所有修飾子</h3>
<p>
参照には強い参照と弱い参照があることは上述したとおりです。それぞれの変数がどのような参照をするべきかは、修飾子で指示します。
</p>
<h4>__strong</h4>
<p>
まず、一番よく使う__strong修飾子です。デフォルトが__strongとなっているため、何も書かずに変数宣言をした場合、すべて強い参照となります。
</p>
<p>
強い参照をしている限り、その変数が参照しているオブジェクトはメモリ上にしっかりと生きています。
</p>
<p>
また、__strongをはじめ、後述する__weak, __autoreleasing変数はすべてnilで初期化されます。
</p>
<h4>__weak</h4>
<p>
弱い参照を示します。例えば、delegateパターンを使うときは、弱い参照を使わないと相互循環(Strong reference cycle)してしまいメモリリークが発生します。
</p>
<p>
弱い参照の特徴は、参照先のオブジェクトが誰からも強参照されなくなったとき、自動的にnilが代入されるということです(Zeroing)。
</p>
<p>
ひとつ注意点として、弱い参照はiOS 4とMac OS X v10.6では利用できません。これらのOSバージョンがDeployment Targetに設定されている状態で__weak修飾子を使うと、コンパイラエラー (The current deployment target does not support automated __weak references) となります。そのようなときは、次の__unsafe_unretainedを使いましょう。
</p>
<h4>__unsafe_unretained</h4>
<p>
参照形態は__weakと同等ですが、こちらはnil初期化やZeroingが行われません。つまり、参照先のオブジェクトが破棄されたあともアドレスが残っているので使用の際には注意が必要です。
</p>
<h4>__autoreleasing</h4>
<p>
最後に__autoreleasingです。これは、これまでオブジェクトにautoreleaseメッセージを送信していたような働きをします。しかし、強参照されているオブジェクトも、変数スコープ外に出れば破棄されるため、あえて明示的に__autoreleasing修飾子を使うことはまれだと思われます。
</p>
<p>
また、__autoreleaseは、メソッドの引数として(id*)等を渡すときにも利用されます。この場合、返された(id*)型のオブジェクトはautoreleaseされています。例えば、<br />
<em>-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;</em> <br />
のようなメソッドは、(NSError **)型の引数を渡す際に__autoreleasingが使われています。
</p>
<h3>その他の注意点</h3>
<p>
Appleの<a href="http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html" target="_blank">Transitioning to ARC Release Notes</a>によると、ARCを利用する際には以下のルールを守る必要があります。</p>
<ul>
<li>retain, release, retainCount, autoreleaseをコールしてはいけない。また、これらのメソッドを実装してもいけない。</li>
<li>deallocをコールしてはいけない（オブジェクトの解放以外の処理が必要な場合、deallocを実装することは可能。ただし、[super dealloc]はコールしない）。</li>
<li>NSAllocateObject, NSDeallocateObjectは使えない。</li>
<li>C構造体の中でオブジェクトポインタを使うことができない（代わりにObjective-Cのクラスを生成すべき）。</li>
<li>idとvoid *間でのキャストには特定の方法を利用する必要がある。</li>
<li>NSAutoReleasePoolは使えない。ただし、@autoreleasepoolブロックの使用が可能。</li>
<li>メモリゾーンは使えない。</li>
<li>&#8220;new&#8221;から始まるプロパティ名は使えない。</li>
</ul>
<p>
キャストとautoreleaseの話は別途まとめる予定です。それ以外は明白だと思います。
</p>
<p>
最後の&#8221;new&#8221;から始まるプロパティ名に関しては、そのような名前のプロパティを宣言するとコンパイラエラーになります。エラーの内容が、&#8221;Property&#8217;s synthesized getter follows Cocoa naming convention for returning &#8216;owned&#8217; objects&#8221;と、ちょっと分かりにくいのでご注意を。
</p>
<h3>まとめ</h3>
<p>
ARCの解説第一弾として基本概念をまとめました。引き続き、使用時の注意点やTipsなどをまとめていく予定です。
</p>
<p>
使い方よりも何よりも、まずは基本概念を知っておくことが重要です。循環参照によるリークなどを引き起こさないよう、ARCによるメモリ管理とは何かをしっかりと理解しておきましょう。
</p>
<p>
質問、間違いの指摘などは、ツイッターでお願いします。 <a href="http://twitter.com/natsun_happy/" target="_blank">@natsun_happy</a>
</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html" target="_blank">Transitioning to ARC Release Notes | iOS Developer Library</a></li>
<li><a href="http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1" target="_blank">Beginning ARC in iOS 5 Part1 | Ray Wenderlich</a></li>
<li>
<a href="http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2" target="_blank">Beginning ARC in iOS 5 Part2 | Ray Wenderlich</a></li>
<li><a href="http://www.raywenderlich.com/store/ios-5-by-tutorials" target="_blank">iOS5 By Tutorials Chapter 3: Intermediate ARC (PDF Book by Ray Wenderlich and others)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.natsuapps.com/2011/11/ios5-arc-overview.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.natsuapps.com/feed ) in 1.88532 seconds, on May 21st, 2012 at 5:15 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 21st, 2012 at 6:15 pm UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  blog.natsuapps.com/feed ) in 0.00078 seconds, on May 21st, 2012 at 6:04 pm UTC. -->
