<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ishwt::tracking &#187; Objective-C</title>
	<atom:link href="http://ishwt.net/blog/category/development/objective-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://ishwt.net</link>
	<description>人 間 万 事 塞 翁 が 馬</description>
	<lastBuildDate>Sat, 05 Nov 2011 15:36:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/category/development/objective-c/feed/" />
		<item>
		<title>Objective-C 2.0 のプロパティ隠蔽</title>
		<link>http://ishwt.net/blog/2010/05/21/objc20-property/</link>
		<comments>http://ishwt.net/blog/2010/05/21/objc20-property/#comments</comments>
		<pubDate>Fri, 21 May 2010 14:33:02 +0000</pubDate>
		<dc:creator>ishwt</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Objective-C 2.0]]></category>

		<guid isPermaLink="false">http://ishwt.net/?p=3651</guid>
		<description><![CDATA[Objective-C 2.0 から導入されたプロパティについて誤解があったのでメモ。
プロパティは、getter と setter の自動生成と値の保持方法を明確化するための仕組みです。これが、C++ や Java で [...]]]></description>
			<content:encoded><![CDATA[<p>Objective-C 2.0 から導入されたプロパティについて誤解があったのでメモ。</p>
<p>プロパティは、getter と setter の自動生成と値の保持方法を明確化するための仕組みです。これが、C++ や Java で不必要にメンバが Public のような、オブジェクト指向のカプセル化をなしくずしにしているように思えて気になっていたのですが、無知からくる勘違いでした。</p>
<p><span id="more-3651"></span></p>
<h3>プロパティの基本。</h3>
<p>クラスのメンバ変数に関する外部からのアクセスは、従来であれば</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Hoge.h</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@interface</span> Hoge <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span>name;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setName<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span>newName;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span>NSInteger<span class="br0">&#41;</span>value;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setValue<span class="sy0">:</span><span class="br0">&#40;</span>NSInteger<span class="br0">&#41;</span>newValue;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Hoge.m</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@implementation</span> Hoge</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>dealloc <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>name release<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span>name <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> name;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setName<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span>newName <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name <span class="sy0">!=</span> newName<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>name release<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy0">=</span> <span class="br0">&#91;</span>newName retain<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span>NSInteger<span class="br0">&#41;</span>value <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> value;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setValue<span class="sy0">:</span><span class="br0">&#40;</span>NSInteger<span class="br0">&#41;</span>newValue <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; value <span class="sy0">=</span> newValue;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<p>と記述しましたが、プロパティを使えば同じことを</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Hoge.h</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@interface</span> Hoge <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>retain<span class="br0">&#41;</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>assign<span class="br0">&#41;</span> NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Hoge.m</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@implementation</span> Hoge</div></li>
<li class="li1"><div class="de1"><span class="kw1">@synthesize</span> name;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@synthesize</span> value;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>dealloc <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>name release<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<p>だけで書けてしまい、さらに利用側からは getter/setter メソッドを呼ぶ代わりにピリオド演算子（.）でアクセスできてしまうという素敵文法。可読性や安全性も向上します。</p>
<p>機能的には C# のプロパティとほぼ同じものです。C++ や Java にはこういった言語機能はありません。</p>
<p>Objective-C 2.0 は Mac OS X 10.5 と共に登場したので、私自身は 10.4 をサポートする IP Messenger では利用出来ず、iPhone アプリの開発で初めて触れました。iPhone の開発チュートリアルや開発本では、どのクラスでもほぼすべてのメンバ変数を readwrite プロパティとして宣言するように記載されており、クラス内部でプロパティアクセスするときにはプロパティの恩恵が受けられるのでいいのですが、そのメンバを外部から書き換えることが出来てしまうのは問題です。これがどうもメンバ変数を不必要に Public 宣言してしまうようで違和感がありました。</p>
<h3>プロパティの再定義。</h3>
<p>プロパティを、外部からは見えないがクラス内部には存在する、外部からは readonly だがクラス内部では readwrite という形で定義できれば、問題は解決します。そういったことができないなんて Objective-C らしくないし、普通に考えておかしいな、と思っていたら、出来ました。</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Hoge.h</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@interface</span> Hoge <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>readonly, retain<span class="br0">&#41;</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>readonly, assign<span class="br0">&#41;</span> NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Hoge.m</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw1">@interface</span> Hoge<span class="br0">&#40;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>readwrite, retain<span class="br0">&#41;</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> name;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@property</span> <span class="br0">&#40;</span>readwrite, assign<span class="br0">&#41;</span> NSInteger value;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@implementation</span> Hoge</div></li>
<li class="li1"><div class="de1"><span class="kw1">@synthesize</span> name;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@synthesize</span> value;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>dealloc <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>name release<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
</ol></div></div></div>
<p>こうすると、Hoge.h を読み込んだソースでは <code>name</code> も <code>value</code> も readonly 属性のプロパティと解釈されて、値は参照できますが代入するとコンパイルエラーになります。ただ、Hoge.m の中では readwrite のプロパティと解釈されて、代入も自在にできるようになります。クラス内部では当然代入する機会がありますので、安全で可読性の高いソースになります。</p>
<p>従来からの Objective-C にもある、カテゴリ拡張によりローカルメソッドを定義するやり方に似ていますが、クラス拡張（無名のカテゴリ拡張）によりプロパティの属性を変更しています。クラス拡張は Objective-C 2.0 の新機能です（いままでは、よく Private とか Local といった名前をつけてクラスローカルメソッドをカテゴリ拡張していました）。<br />
プロパティの属性変更は、クラス拡張の他にプロトコルとサブクラスでも可能です。</p>
<p>詳しくは、以下の URL のドキュメントの中にある「Objective-C 2.0 プログラミング言語」を参照ください。他にもプロパティ宣言に関する仕様などが説明されています。</p>
<p><a href="http://developer.apple.com/jp/documentation/japanese.html" target="_blank">http://developer.apple.com/jp/documentation/japanese.html</a></p>
<p>萩原本も Objective-C 2.0 の改訂版買ってちゃんと読まなきゃ（改訂前のは持ってるのですが）。<br />
<div class="tmkm-amazon-view">
	<p><a href="http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Objective-C-2-0-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797346809%3FSubscriptionId%3DAKIAIVJ5V2EYEHPAGUKA%26tag%3Dishwt-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4797346809" target="_blank"><img src="http://ecx.images-amazon.com/images/I/410jfSYvTIL._SL160_.jpg" border="0" alt="" /></a></p>
	<p><a href="http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Objective-C-2-0-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797346809%3FSubscriptionId%3DAKIAIVJ5V2EYEHPAGUKA%26tag%3Dishwt-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4797346809" target="_blank">詳解 Objective-C 2.0</a></p>
<hr class="tmkm-amazon-clear" /></div>
]]></content:encoded>
			<wfw:commentRss>http://ishwt.net/blog/2010/05/21/objc20-property/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/2010/05/21/objc20-property/" />
	</item>
		<item>
		<title>SystemConfiguration.framework でネットワークの変化を知る</title>
		<link>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/</link>
		<comments>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 13:52:29 +0000</pubDate>
		<dc:creator>ishwt</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[SystemConfiguration.framework]]></category>

		<guid isPermaLink="false">http://ishwt.net/?p=2836</guid>
		<description><![CDATA[前回、SystemConfiguration.framework の DynamicStore からネットワークの状態を得る方法を書きましたが、今回はさらにその変化を検出して処理を行う方法です。すぐ次のエントリで書こうと [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/">前回</a>、SystemConfiguration.framework の DynamicStore からネットワークの状態を得る方法を書きましたが、今回はさらにその変化を検出して処理を行う方法です。すぐ次のエントリで書こうと思っていたのに遅くなってしまいました。</p>
<p><img src="http://ishwt.net/wp-content/uploads/2010/02/sc-catch-title.png" title="sc-catch-title" width="468" height="132" class="aligncenter size-full wp-image-2969" /></p>
<p><span id="more-2836"></span></p>
<p>ネットワーク環境の変化は、コンピュータの名称が変わったり、ネットワークの接続環境が変わったり、ということが考えられます。前者はシステム環境設定での変更によるものですし、後者はイーサネットケーブルが抜けたり、無線 LAN の ON / OFF や弱電界での切断、ノートタイプの場合のスリープ復帰などなど、結構あります。</p>
<p>ネットワークを利用するアプリケーションでは、動作中にネットワークの環境が変わったら、アプリケーションとしてそれに応じた振る舞いや動作の変化をさせるのが望ましく、今回の説明はそのためにネットワーク状況の変化を検出する方法です。</p>
<p>Cocoa (Objective-C) ではよく NSNotificationCenter にオブザーバとして登録して通知を受けます。C言語で実装するものの、それと同様の方式で取得します。</p>
<p>サンプルなソースの全体像はこんな感じ。エラー処理と終了時のお片付け処理は省略してあるので脳内補完してください。</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">DynamicStore 通知サンプル</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw4">static</span> <span class="kw4">void</span> _CallbackFunc<span class="br0">&#40;</span>SCDynamicStoreRef store, CFArrayRef changedKeys, <span class="kw4">void</span> <span class="sy0">*</span>info<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@interface</span> NetTest</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreRef &nbsp; scDynStore;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreContext &nbsp; scContext;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRunLoopSourceRef&nbsp; runLoopSource;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setupSC;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@implementation</span> NetTest</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setupSC</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef keys<span class="br0">&#91;</span>2<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFArrayRef&nbsp; keyArray;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/memset.html"><span class="kw3">memset</span></a><span class="br0">&#40;</span><span class="sy0">&amp;</span>scContext, 0, <a href="http://www.opengroup.org/onlinepubs/009695399/functions/sizeof.html"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span>scContext<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; scContext.info&nbsp; <span class="sy0">=</span> self;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; scDynStore&nbsp; <span class="sy0">=</span> SCDynamicStoreCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span class="kw5">NSBundle</span></a> mainBundle<span class="br0">&#93;</span> bundleIdentifier<span class="br0">&#93;</span>, _CallbackFunc, <span class="sy0">&amp;</span>amp;scContext<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; runLoopSource &nbsp; <span class="sy0">=</span> SCDynamicStoreCreateRunLoopSource<span class="br0">&#40;</span><span class="kw2">NULL</span>, scDynStore, 0<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keys<span class="br0">&#91;</span>0<span class="br0">&#93;</span> &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreKeyCreateHostNames<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keys<span class="br0">&#91;</span>1<span class="br0">&#93;</span> &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkGlobalEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keyArray&nbsp; &nbsp; <span class="sy0">=</span> CFArrayCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">void</span><span class="sy0">**</span><span class="br0">&#41;</span>keys, 2, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreSetNotificationKeys<span class="br0">&#40;</span>scDynStore, keyArray, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRunLoopAddSource<span class="br0">&#40;</span>CFRunLoopGetCurrent<span class="br0">&#40;</span><span class="br0">&#41;</span>, runLoopSource, kCFRunLoopDefaultMode<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keyArray<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keys<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keys<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">unsigned</span> i;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; <span class="br0">&#91;</span>changedKeys count<span class="br0">&#93;</span>; i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> key <span class="sy0">=</span> <span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span><span class="br0">&#91;</span>changedKeys objectAtIndex<span class="sy0">:</span>i<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;SystemConfiguration key[%d] '%@' is changed!&quot;</span>, i, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">// 各種処理</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">// （キーの値を取り出したり、画面の表示を更新したり）</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> _CallbackFunc<span class="br0">&#40;</span>SCDynamicStoreRef&nbsp; &nbsp; store, CFArrayRef changedKeys, <span class="kw4">void</span> <span class="sy0">*</span>info<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NetTest <span class="sy0">*</span>self <span class="sy0">=</span> <span class="br0">&#40;</span>NetTest<span class="sy0">*</span><span class="br0">&#41;</span>info;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>self updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol></div></div></div>
<p>まず、前回と異なるのは DynamicStore を作る <code>SCDynamicStoreCreate()</code> 関数の第三引数に、 <code>NULL</code> ではなくコールバック関数 <code>_CallbackFunc</code> を設定しています。 <code>_CallbackFunc</code> は先頭のプロトタイプ宣言のとおり、DynamicStore と、変更があったキーの一覧、そしてコンテキストの情報が渡ってきます。最後のコンテキスト情報 (<code>info</code>) は、パラメタで渡している <code>context.info</code> が設定されることになっていて、DynamicStore はその内容を関知していません。コールバック関数で利用するために、<code>self</code> を設定しておきます。</p>
<p>続いて、実際に変更があったらコールバックを呼び出すための設定処理をしています。<br />
監視したいキーを CFArrayRef にして登録します。キーは前回みたとおり、<code>scutil</code> で確認した中から、必要なものを選んで監視するとよいと思います。RunLoopSource まわりの手続はおまじないと思っておけばいいかと。</p>
<p>これで、登録しておいたキー項目に変化があると、コールバック関数が呼ばれるようになります。コールバック関数は、<code>NetTest</code> クラスのメンバではない単なる C の関数ですので、コールバック関数の <code>info</code> に設定しておいたクラスのインスタンスをキャストしてそのメソッドを呼び出して処理させます。</p>
<p>実際の処理は、ループして変化したキーをチェック、キーの値を DynamicStore から取り出して、適切な処理や GUI への操作を行う、ということになります。</p>
<p>まとめると以下でしょうか。</p>
<ul>
<li>コールバック関数を登録する</li>
<li>監視したいキーのリストを用意して登録する</li>
<li>RunLoopSourceを追加する</li>
<li>コールバック関数から処理メソッドを呼び出す</li>
<li>処理メソッド内でキーを判定して応じた処理をする</li>
</ul>
<p>ちょっと駆け足でしたが、こんな感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/" />
	</item>
		<item>
		<title>SystemConfiguration.framework でネットワークの情報を得る</title>
		<link>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/</link>
		<comments>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 19:56:36 +0000</pubDate>
		<dc:creator>ishwt</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[SystemConfiguration.framework]]></category>

		<guid isPermaLink="false">http://ishwt.net/?p=2771</guid>
		<description><![CDATA[Mac アプリのプログラミングで、SystemConfiguration.framework の DynamicStore を利用すると、ネットワーク関連の現在状態や設定値を取得できます。ネットワーク以外にもいくつか取得 [...]]]></description>
			<content:encoded><![CDATA[<p>Mac アプリのプログラミングで、SystemConfiguration.framework の DynamicStore を利用すると、ネットワーク関連の現在状態や設定値を取得できます。ネットワーク以外にもいくつか取得できたりします。</p>
<p><img src="http://ishwt.net/wp-content/uploads/2010/01/SC_capture.png" title="SC_capture" width="468" height="160" class="aligncenter size-full wp-image-2775" /></p>
<p>SystemConfiguration.framework は C 言語の API が用意されており、Objective-C の API はありません。関数等の接頭詞は &#8220;SC&#8221; です。</p>
<p><span id="more-2771"></span></p>
<h3>キー。</h3>
<p>DynamicStore は名前からも分かるとおり現在のダイナミック（動的）な設定情報・状態値を保持していて、URI 形式のキーで値を取得することができます。<br />
<code>State:/Network/Global/DNS</code><br />
といった表記でキーが表されます。キーは多岐にわたりますし、特定の文法で記載されるので、簡単にキーを取得するためのユーティリティ関数が用意されています。</p>
<p><code>SCDynamicStoreKey.h</code></p>
<p><code> </code></p>
<p><code></p>
<ul>
<li>SCDynamicStoreKeyCreateConsoleUser()</li>
<li>SCDynamicStoreKeyCreateHostNames()</li>
<li>SCDynamicStoreKeyCreateLocation()</li>
<li>SCDynamicStoreKeyCreateNetworkGlobalEntity()</li>
<li>SCDynamicStoreKeyCreateNetworkInterface()</li>
<li>SCDynamicStoreKeyCreateNetworkInterfaceEntity()</li>
<li>SCDynamicStoreKeyCreateNetworkServiceEntity()</li>
<li>SCDynamicStoreKeyCreateProxies()</li>
</ul>
<p></code><br />
また、各関数にキーの可変部をパラメタとして渡す場合の定数が、SCSchemaDefinitions.h に多数記載されています。<br />
ただ、上記の関数リファレンスやヘッダを見ても、実際にどのようなキーがあり、上記のユーティリティ関数に与えるパラメタも、結果として得られるキーも、いまひとつ具体的に分かりません。<br />
そこで役に立つのが <code>scutil</code> というコマンド。</p>
<pre class="console">$ scutil
&gt;
&gt; list
  subKey [0] = Plugin:IPConfiguration
  subKey [1] = Plugin:InterfaceNamer
  subKey [2] = Setup:
  subKey [3] = Setup:/
  subKey [4] = Setup:/Network/BackToMyMac
  subKey [5] = Setup:/Network/Global/IPv4
  subKey [6] = Setup:/Network/HostNames
  subKey [7] = Setup:/Network/Interface/en1/AirPort
  subKey [8] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41
  subKey [9] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/IPv4
  subKey [10] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/IPv6
  subKey [11] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Interface
  subKey [12] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Modem
  subKey [13] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/PPP
  subKey [14] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Proxies
  subKey [15] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA
  subKey [16] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv4
  subKey [17] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv6
  subKey [18] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/Interface
  subKey [19] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/Proxies
  subKey [20] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396
  subKey [21] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/IPv4
  subKey [22] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/IPv6
  subKey [23] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/Interface
  subKey [24] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/Proxies
  subKey [25] = Setup:/System
  subKey [26] = State:/IOKit/LowBatteryWarning
  subKey [27] = State:/IOKit/Power/CPUPower
  subKey [28] = State:/IOKit/PowerAdapter
  subKey [29] = State:/IOKit/PowerManagement/Assertions
  subKey [30] = State:/IOKit/PowerManagement/CurrentSettings
  subKey [31] = State:/IOKit/PowerManagement/SystemLoad
  subKey [32] = State:/IOKit/PowerManagement/SystemLoad/Detailed
  subKey [33] = State:/IOKit/PowerSources/InternalBattery-0
  subKey [34] = State:/IOKit/SystemPowerCapabilities
  subKey [35] = State:/Network/BackToMyMac
  subKey [36] = State:/Network/Global/DNS
  subKey [37] = State:/Network/Global/IPv4
  subKey [38] = State:/Network/Global/Proxies
  subKey [39] = State:/Network/Interface
  subKey [40] = State:/Network/Interface/en0/Link
  subKey [41] = State:/Network/Interface/en1/AirPort
  subKey [42] = State:/Network/Interface/en1/IPv4
  subKey [43] = State:/Network/Interface/en1/IPv6
  subKey [44] = State:/Network/Interface/en1/Link
  subKey [45] = State:/Network/Interface/lo0/IPv4
  subKey [46] = State:/Network/Interface/lo0/IPv6
  subKey [47] = State:/Network/Interface/vmnet1/IPv4
  subKey [48] = State:/Network/Interface/vmnet8/IPv4
  subKey [49] = State:/Network/MulticastDNS
  subKey [50] = State:/Network/PrivateDNS
  subKey [51] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/DHCP
  subKey [52] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/DNS
  subKey [53] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv4
  subKey [54] = State:/Users/ConsoleUser
  subKey [55] = com.apple.DirectoryService.NotifyTypeStandard:DirectoryNodeAdded
  subKey [56] = com.apple.network.identification
&gt;</pre>
<p><code>scutil</code> は起動するとプロンプトになりコマンドが入力できます。<code>help</code>で利用出来るコマンドが表示されますので見てみてください。そこそこいろいろ出来ます。<br />
今回は、<code>list</code>と言うコマンドで、利用出来るキーの一覧を表示しています。なお、キーは常に一定ではなく、ネットワークの状況によって増減します。</p>
<h3>値。</h3>
<p>DynamicStore から取得できる値は NSDictionary ( CFDictionary ) で、実際の個別の設定値はさらにその中に規定のプロパティ名で格納されています。これは <code>scutil</code> の <code>show</code> コマンドで確認することができます。</p>
<pre class="console">&gt; show State:/Network/Global/IPv4
&lt;dictionary&gt; {
  PrimaryInterface : en1
  PrimaryService : 6C67FE3C-C7EC-4885-9250-307B8EBA5DEA
  Router : 192.168.1.1
}
&gt; show State:/Network/Interface/en1/Link
&lt;dictionary&gt; {
  Active : TRUE
}
&gt; show State:/Network/Interface/en1/IPv4
&lt;dictionary&gt; {
  Addresses : &lt;array&gt; {
    0 : 192.168.1.102
  }
  BroadcastAddresses : &lt;array&gt; {
    0 : 192.168.1.255
  }
  SubnetMasks : &lt;array&gt; {
    0 : 255.255.255.0
  }
}
&gt;</pre>
<div id="_mcePaste">このように、PrimaryInterface（優先されるネットワーク）が &#8220;en1&#8243; （無線 LAN）で、無線 LAN の リンク状態、IP アドレス、ブロードキャストアドレス、サブネットマスクなどが分かります。</div>
<h3>コード例。</h3>
<p>さて、これをプログラム上ではどう取得するかですが、結構簡単です。</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">利用サンプル</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="co1">#import &lt;Cocoa/Cocoa.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">#import &lt;SystemConfiguration/SCDynamicStoreKey.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">#import &lt;SystemConfiguration/SCSchemaDefinitions.h&gt;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>test</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreRef &nbsp; store;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreContext &nbsp; context;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; key;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFDictionaryRef &nbsp; &nbsp; val;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; host;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; primIF;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFArrayRef&nbsp; &nbsp; &nbsp; addrs;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; addr;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// DynaimcStore生成</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/memset.html"><span class="kw3">memset</span></a><span class="br0">&#40;</span><span class="sy0">&amp;</span>context, 0, <a href="http://www.opengroup.org/onlinepubs/009695399/functions/sizeof.html"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span>context<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; context.info&nbsp; &nbsp; <span class="sy0">=</span> self;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; store &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span class="kw5">NSBundle</span></a> mainBundle<span class="br0">&#93;</span> bundleIdentifier<span class="br0">&#93;</span>, <span class="kw2">NULL</span>, <span class="sy0">&amp;</span>context<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// コンピュータ名取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateHostNames<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; host&nbsp; &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCPropNetLocalHostName<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;HostName is %@.&quot;</span>, host<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// PrimaryInteaface取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkGlobalEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; primIF&nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCDynamicStorePropNetPrimaryInterface<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;PrimaryInterface is %@.&quot;</span>, primaryIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRetain<span class="br0">&#40;</span>primIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// IPアドレス取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkInterfaceEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, primIF, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; addrs &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFArrayRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCPropNetIPv4Addresses<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; addr&nbsp; &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFArrayGetValueAtIndex<span class="br0">&#40;</span>addrs, 0<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;IP Address is %@&quot;</span>, addr<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>primIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol></div></div></div>
<p>上記サンプルはエラー処理をしていませんが、値を階層的に取得しているので、エラーチェックは処理の都度行う必要があります。</p>
<p><code>scutil</code> で欲しいキーを確認すれば、別のキーでも取得の方法は同じ要領です。ネットワークの設定や諸情報、ネットワーク以外にも電源（電池）の状態などもわかったり、結構面白いです。</p>
<p>実は、DynamicStore を使うと今回取得したような値の変化（ネットワーク状態の変化、システム環境設定での変更）を検出することもできますが、それは次回に。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/" />
	</item>
	</channel>
</rss>

