<?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>Notes of a Developer &#187; Кодинг</title>
	<atom:link href="http://www.developers-life.com/tag/%d0%ba%d0%be%d0%b4%d0%b8%d0%bd%d0%b3/feed" rel="self" type="application/rss+xml" />
	<link>http://www.developers-life.com</link>
	<description>Develop on Objective-C, UIKit, C, OpenGL for  iPhone, iPad, Mac OS X</description>
	<lastBuildDate>Fri, 03 Feb 2012 11:49:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>NSRegularExpression sample for comment syntax highlighting</title>
		<link>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html</link>
		<comments>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html#comments</comments>
		<pubDate>Tue, 08 Nov 2011 00:25:10 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[matchesInString]]></category>
		<category><![CDATA[NSRegularExpression]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[RegExp]]></category>
		<category><![CDATA[regexpal]]></category>
		<category><![CDATA[regularExpressionWithPattern]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1321</guid>
		<description><![CDATA[I have this text: 1word1 word2 &#34; word3 //&#34; word4 I wrote simple solution. I know it can be better. I know about Back Reference, but i don&#8217;t have experience with it. 123456789101112131415161718192021222324252627282930313233NSRegularExpression *expression = &#91;NSRegularExpression regularExpressionWithPattern:@&#34;((@\&#34;&#124;\&#34;).*?(\&#34;))&#34; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>I have this text:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">word1 word2 <span style="color: #bf1d1a;">&quot; word3 //&quot;</span> word4</div></td></tr></tbody></table></div>
<p>I wrote simple solution. I know it can be better. I know about Back Reference, but i don&#8217;t have experience with it.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NSRegularExpression <span style="color: #002200;">*</span>expression <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSRegularExpression regularExpressionWithPattern<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;((@<span style="color: #2400d9;">\&quot;</span>|<span style="color: #2400d9;">\&quot;</span>).*?(<span style="color: #2400d9;">\&quot;</span>))&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options<span style="color: #002200;">:</span>NSRegularExpressionDotMatchesLineSeparators <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a> <span style="color: #002200;">*</span>textArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>expression matchesInString<span style="color: #002200;">:</span>textString options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> range<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #002200;">&#91;</span>textString length<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>result <span style="color: #a61390;">in</span> textArray<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set color for range</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #11740a; font-style: italic;">// Comments</span><br />
expression <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSRegularExpression regularExpressionWithPattern<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;(//[^<span style="color: #2400d9;">\&quot;</span><span style="color: #2400d9;">\n</span>]*)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a> <span style="color: #002200;">*</span> arrayComments <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>expression matchesInString<span style="color: #002200;">:</span>textString options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> range<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #002200;">&#91;</span>textString length<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>resultComment <span style="color: #a61390;">in</span> arrayComments<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #a61390;">BOOL</span> inside <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>resultText <span style="color: #a61390;">in</span> textArray<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger from <span style="color: #002200;">=</span> resultText.range.location;<br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger to <span style="color: #002200;">=</span> resultText.range.location<span style="color: #002200;">+</span>resultText.range.length;<br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger now <span style="color: #002200;">=</span> resultComment.range.location;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>from &lt; now <span style="color: #002200;">&amp;&amp;</span> now &lt; to<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inside <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>inside<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set color for range</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Picker for iOS</title>
		<link>http://www.developers-life.com/color-picker-for-ios.html</link>
		<comments>http://www.developers-life.com/color-picker-for-ios.html#comments</comments>
		<pubDate>Sat, 29 Oct 2011 12:17:25 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[UIColor]]></category>
		<category><![CDATA[UIImage]]></category>
		<category><![CDATA[Ukraine]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1302</guid>
		<description><![CDATA[Example: 1234567891011121314151617181920212223242526272829303132333435363738394041- &#40;void&#41;viewDidLoad &#123; &#160; &#160; &#91;super viewDidLoad&#93;; &#160; &#160; &#160; &#160; // Do any additional setup after loading the view, typically from a nib. &#160; &#160; &#160; &#160; if &#40;self.cPicker == nil&#41; &#123; &#160; &#160; &#160; &#160; &#91;self.view setBackgroundColor:&#91;UIColor grayColor&#93;&#93;; &#160; &#160; &#160; &#160; self.cPicker = &#91;&#91;VBColorPicker alloc&#93; initWithFrame:CGRectMake&#40;0, 0, 202, 202&#41;&#93;; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.developers-life.com/wp-content/uploads/2011/10/Screen-Shot-Color-Picker.png"><img class="alignnone size-full wp-image-1303" title="Screen Shot Color Picker" src="http://www.developers-life.com/wp-content/uploads/2011/10/Screen-Shot-Color-Picker.png" alt="" width="317" height="595" /></a></p>
<p>Example:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Do any additional setup after loading the view, typically from a nib.</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.cPicker <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self.view setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor grayColor<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.cPicker <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>VBColorPicker alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">202</span>, <span style="color: #2400d9;">202</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setCenter<span style="color: #002200;">:</span>self.view.center<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>_cPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setDelegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker showPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set default YES!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setHideAfterSelection<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// set color from picker</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> pickedColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>color <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_rect setBackgroundColor<span style="color: #002200;">:</span>color<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker hidePicker<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> touchesBegan<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/"><span style="color: #400080;">NSSet</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span>_cPicker isHidden<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker hidePicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// show picker by double touch</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> touchesEnded<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/"><span style="color: #400080;">NSSet</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UITouch <span style="color: #002200;">*</span>touch <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>touches anyObject<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>touch.tapCount <span style="color: #002200;">==</span> <span style="color: #2400d9;">2</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setCenter<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>touch locationInView<span style="color: #002200;">:</span>self.view<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker showPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><a href="https://github.com/sakrist/VBColorPicker" target="_blank"><img src="http://www.developers-life.com/wp-content/uploads/2011/08/github-logo-80px.png" alt="" title="github-logo-80px" width="130" height="80" class="alignnone size-full wp-image-1257" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/color-picker-for-ios.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Основы Grand Central Dispatch</title>
		<link>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html</link>
		<comments>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html#comments</comments>
		<pubDate>Fri, 08 Apr 2011 10:00:41 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[GCD]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1206</guid>
		<description><![CDATA[В предыдущих статьях писал, что хотел перевести одну интересную статью с английского, но вот нашел перевод  хорошей статьи на русский. Думаю автор перевода не будет против если я копию возьму себе :) Что это? Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущих статьях писал, что хотел перевести одну интересную статью с английского, но вот нашел перевод  <noindex><a href="http://touchdev.ru/documents/1519">хорошей статьи на русский</a></noindex>. Думаю автор перевода не будет против если я копию возьму себе :)</p>
<h3>Что это?</h3>
<p>Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не parallel, я не знаю нор­маль­но­го пе­ре­во­да, ес­ли кто ска­жет — на­пи­ши­те в ком­мен­та­ри­ях, прим. пер.) про­грам­ма­ми. На са­мом про­стом уровне по­ни­ма­ния, ме­то­до­ло­гия по­хо­жа на <span style="color: #993366;">NSOperationQueue</span>, ко­то­рая поз­во­ля­ет раз­би­вать про­грам­му на неза­ви­си­мые за­да­чи, ко­то­рые за­пус­кать па­рал­лель­но или по­сле­до­ва­тель­но. GCD ра­бо­та­ет на бо­лее низ­ком уровне, предо­став­ля­ет боль­шую про­из­во­ди­тель­ность и не яв­ля­ет­ся ча­стью Cocoa.</p>
<p>В до­пол­не­ние к сред­ствам па­рал­лель­но­го вы­пол­не­ния ко­да, GCD та­к­же предо­став­ля­ет пол­но­стью ин­те­гри­ро­ван­ную си­сте­му об­ра­бот­ки со­бы­тий. Об­ра­бот­чи­ки мо­гут быть скон­фи­гу­ри­ро­ва­ны та­ким об­ра­зом, что­бы ре­а­ги­ро­вать на со­бы­тия от фай­ло­вых де­скрип­то­ров, си­стем­ных пор­тов и про­цес­сов, тай­ме­ров и сиг­на­лов, и на поль­зо­ва­тель­ские со­бы­тия. Эти об­ра­бот­чи­ки ис­пол­ня­ют­ся па­рал­лель­но при по­мо­щи ин­фра­струк­ту­ры GCD.</p>
<p>API GCD пол­но­стью ос­но­ван на так на­зы­ва­е­мых бло­ках, о ко­то­рых я го­во­рил в преды­ду­щих се­ри­ях от­ве­тов на во­про­сы («Поз­воль­те пред­ста­вить»: бло­ки и «Об­суж­де­ние прак­ти­че­ских ас­пек­тов ис­поль­зо­ва­ния бло­ков в обыч­ном ко­де»). GCD мож­но ис­поль­зо­вать и без бло­ков, при­ме­няя тра­ди­ци­он­ные C-​шные ме­ха­низ­мы ука­за­те­лей на функ­ции и кон­тек­ста, но ис­поль­зо­вать бло­ки го­раз­до про­ще и неве­ро­ят­но удоб­нее с прак­ти­че­ской точ­ки зре­ния.</p>
<p>Для по­лу­че­ния си­стем­ной до­ку­мен­та­ции по GCD, мож­но на­брать <span style="color: #993366;">man dispatch</span> в ко­манд­ной стро­ке, ес­ли у вас Snow Leopard.<span id="more-1206"></span></p>
<h3>Зачем это нужно использовать?</h3>
<p>GCD да­ет мно­же­ство пре­иму­ществ пе­ред тра­ди­ци­он­ным мно­го­по­точ­ным про­грам­ми­ро­ва­ни­ем:</p>
<ul>
<li>Про­сто­та ис­поль­зо­ва­ния. GCD ис­поль­зо­вать го­раз­до про­ще, чем по­то­ки. Так как ос­но­вой яв­ля­ют­ся эле­мен­ты ра­бо­ты, а не по­то­ки вы­чис­ле­ний, мож­но про­сто за­пу­стить на вы­пол­не­ние ра­бо­ту, не за­бо­тясь о стан­дарт­ных за­да­чах, та­ких, как ожи­да­ние за­вер­ше­ния ра­бо­ты, от­сле­жи­ва­ние де­скрип­то­ров фай­лов, ис­пол­не­ние ко­да с ка­кой-​то пе­ри­о­дич­но­стью, вре­мен­ная при­оста­нов­ка ра­бо­ты. API, ос­но­ван­ные на бло­ках поз­во­ля­ют с необы­чай­ной лег­ко­стью пе­ре­да­вать кон­текст меж­ду раз­лич­ны­ми ча­стя­ми ко­да.</li>
<li>Эф­фек­тив­ность. GCD ре­а­ли­зо­ван лег­ко­вес­ным спо­со­бом, что де­ла­ет го­раз­до бо­лее прак­тич­ным и быст­рым ис­поль­зо­ва­ние GCD в тех ме­стах, где вы­де­лен­ные по­то­ки слиш­ком за­трат­ны. С этим тес­но свя­за­на про­сто­та ис­поль­зо­ва­ния: от­ча­сти, то, что поз­во­ля­ет так лег­ко ис­поль­зо­вать GCD, поз­во­ля­ет и не силь­но при его ис­поль­зо­ва­нии за­бо­тить­ся об эф­фек­тив­но­сти.</li>
<li>Про­из­во­ди­тель­ность. GCD ав­то­ма­ти­че­ски мас­шта­би­ру­ет­ся (со­зда­ет и уда­ля­ет по­то­ки) в со­от­вет­ствии с за­груз­кой си­сте­мы, что ве­дет за со­бой мень­шее ко­ли­че­ство пе­ре­клю­че­ний кон­тек­ста и боль­шую вы­чис­ли­тель­ную эф­фек­тив­ность.</li>
</ul>
<h3><!--more--></h3>
<h3>Посылки (Dispatch Objects)</h3>
<p>Не смот­ря на то, что GCD — это чи­стый C, он спро­ек­ти­ро­ван в объ­ект­ном сти­ле. Объ­ек­ты GCD на­зы­ва­ют­ся по­сыл­ка­ми (Dispatch Objects). По­сыл­ки ис­поль­зу­ют под­счет ссы­лок, как и объ­ек­ты Cocoa. Для под­сче­та ссы­лок (кон­тро­ля за па­мя­тью) мож­но ис­поль­зо­вать функ­ции <span style="color: #993366;">dispatch_retain</span> и <span style="color: #993366;">dispatch_release</span>. Сто­ит пом­нить, что, в от­ли­чие от объ­ек­тов Cocoa, по­сыл­ки не участ­ву­ют в сбор­ке му­со­ра, то есть ими нуж­но управ­лять вруч­ную, да­же ес­ли вклю­чен сбор­щик му­со­ра (к iOS это по-​преж­не­му по­ка не от­но­сит­ся, прим. пер).</p>
<p>Оче­ре­ди по­сы­лок и ис­точ­ни­ки по­сы­лок (что это — чуть позд­нее) мо­гут быть при­оста­нов­ле­ны и за­пу­ще­ны сно­ва, мо­гут со­дер­жать про­из­воль­ный ука­за­тель на кон­текст, с ни­ми ас­со­ци­и­ро­ван­ный, и «фи­на­лай­зер», то есть за­вер­ша­ю­щую функ­цию. Для бо­лее по­дроб­ной ин­фор­ма­ции мож­но по­смот­реть на man <span style="color: #993366;">dispatch_object</span>.</p>
<h3>Очереди посылок</h3>
<p>Фун­да­мен­таль­ная кон­цеп­ция в GCD — оче­редь по­сы­лок. Это объ­ект, ко­то­рый по­лу­ча­ет ин­фор­ма­цию о за­да­ни­ях и ко­то­рый вы­пол­ня­ет их в той же по­сле­до­ва­тель­но­сти, в ко­то­рой по­лу­чил. Оче­редь мо­жет быть ли­бо па­рал­лель­ной ли­бо по­сле­до­ва­тель­ной. Па­рал­лель­ная оче­редь мо­жет ис­пол­нять мно­го за­да­ний од­но­вре­мен­но, на­сколь­ко это адек­ват­но те­ку­щей за­груз­ке си­сте­мы, при­мер­но как и <span style="color: #993366;">NSOperationQueue</span>. По­сле­до­ва­тель­ная оче­редь бу­дет вы­пол­нять по од­ной за­да­че еди­но­вре­мен­но.</p>
<p>Все­го в GCD три ти­па оче­ре­дей:</p>
<ul>
<li>Глав­ная оче­редь. По­хож на глав­ный по­ток. На са­мом де­ле, за­да­ния, ко­то­рые от­прав­ле­ны на ис­пол­не­ние в глав­ную оче­редь, ис­пол­ня­ют­ся в глав­ном по­то­ке про­цес­са. Ссыл­ку на глав­ную оче­редь мож­но по­лу­чить, вы­звав функ­цию <span style="color: #993366;">dispatch_get_main_queue(). </span>Так как глав­ная оче­редь за­ви­си­ма от од­но­го глав­но­го по­то­ка, это по­сле­до­ва­тель­ная оче­редь.</li>
<li>Гло­баль­ные оче­ре­ди. Гло­баль­ные оче­ре­ди — это па­рал­лель­ные оче­ре­ди, ко­то­рые сов­мест­но ис­поль­зу­ют­ся всем про­цес­сом. Все­го их три: оче­редь с низ­ким при­о­ри­те­том, оче­редь с обыч­ным при­о­ри­те­том, оче­редь с вы­со­ким при­о­ри­те­том. Ссыл­ки на гло­баль­ные оче­ре­ди мож­но по­лу­чить при по­мо­щи функ­ций <span style="color: #993366;">dispatch_get_global_queue</span>, ука­зы­вая, оче­редь с ка­ким при­о­ри­те­том вам нуж­на.</li>
<li>Поль­зо­ва­тель­ские (custom) оче­ре­ди. На са­мом де­ле у них нет на­зва­ния, по­это­му бу­дем на­зы­вать их «поль­зо­ва­тель­ски­ми». Эти оче­ре­ди со­зда­ют­ся при по­мо­щи функ­ции <span style="color: #993366;">dispatch_queue_create</span>. Это по­сле­до­ва­тель­ные оче­ре­ди, ко­то­рые мо­гут ис­пол­нять од­но за­да­ние в каж­дый мо­мент вре­ме­ни. Бла­го­да­ря это­му они мо­гут быть как ме­ха­низм син­хро­ни­за­ции, при­мер­но как mutex в тра­ди­ци­он­ном мно­го­по­точ­ном про­грам­ми­ро­ва­нии.</li>
</ul>
<h3>Создание очередей</h3>
<p>Ес­ли вы хо­ти­те ис­поль­зо­вать поль­зо­ва­тель­скую оче­редь, ее пред­ва­ри­тель­но нуж­но со­здать. Для это­го про­сто вы­зо­ви­те функ­цию <span style="color: #993366;">dispatch_queue_create</span>. Пер­вый па­ра­метр — мет­ка, ко­то­рая ис­поль­зу­ет­ся ис­клю­чи­тель­но в це­лях от­лад­ки. Apple ре­ко­мен­ду­ет ис­поль­зо­вать «об­рат­ное DNS» име­но­ва­ние для со­зда­ния уни­каль­ных имен, на­при­мер, «com.​yourcompany.​subsystem.​task». Эти име­на бу­дут отоб­ра­жать­ся в про­то­ко­лах оши­бок при сбое и мо­гут быть по­лу­че­ны из от­лад­чи­ка, что очень по­мо­га­ет по­нять, что пошло не так. Вто­рой ар­гу­мент функ­ции не под­дер­жи­ва­ет­ся и в на­сто­я­щий мо­мент ту­да нуж­но пе­ре­да­вать NULL.</p>
<h3>Передача заданий в очередь</h3>
<p>Пе­ре­да­ча за­да­ния в оче­редь очень про­ста. Нуж­но вы­звать функ­цию <span style="color: #993366;">dispatch_async</span> и пе­ре­дать ей оче­редь и блок. Оче­редь вы­пол­нит блок, ко­гда смо­жет. Вот при­мер ис­пол­не­ния дли­тель­ной фо­но­вой ра­бо­ты в гло­баль­ной оче­ре­ди:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_global_queue<span style="color: #002200;">&#40;</span>DISPATCH_QUEUE_PRIORITY_DEFAULT, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self goDoSomethingLongAndInvolved<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Done doing something long and involved&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p><span style="color: #993366;"> dispatch_async</span> воз­вра­ща­ет управ­ле­ние сра­зу же, а блок бу­дет про­дол­жать вы­пол­не­ние асин­хрон­но в фоне.</p>
<p>Ко­неч­но, вы­зы­вать <span style="color: #993366;">NSLog</span> по­сле окон­ча­ния ра­бо­ты бло­ка не ин­те­рес­но. Обыч­но вам нуж­но об­но­вить что-​то в Cocoa-​ин­тер­фей­се, то есть вы­пол­нить ка­кой-​то код в глав­ном по­то­ке. Это мож­но сде­лать, ис­поль­зуя на­сле­ду­е­мые по­сыл­ки, то есть по­сыл­ку в глав­ную оче­редь внут­ри за­да­чи, вы­пол­ня­е­мой в фо­но­вой оче­ре­ди. При­мер­но вот так:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_global_queue<span style="color: #002200;">&#40;</span>DISPATCH_QUEUE_PRIORITY_DEFAULT, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self goDoSomethingLongAndInvolved<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>textField setStringValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Done doing something long and involved&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Та­к­же есть функ­ция <span style="color: #993366;">dispatch_sync</span>, ко­то­рая де­ла­ет то же са­мое, но при этом ожи­дая, по­ка блок за­вер­шит ис­пол­не­ние пе­ред тем, как вер­нуть управ­ле­ние. Вме­сте с ти­пом <span style="color: #993366;">__block</span>, это мо­жет быть ис­поль­зо­ва­но для по­лу­че­ния воз­вра­ща­е­мо­го зна­че­ния из вы­пол­нен­но­го бло­ка. На­при­мер, ес­ли у вас есть ка­кой-​то код, ис­пол­ня­ю­щий­ся в фо­но­вом по­то­ке (или, еще луч­ше ска­зать, не глав­ной оче­ре­ди по­сы­лок), ко­то­рый дол­жен по­лу­чить зна­че­ние из GUI-​кон­тро­ла. Это мо­жет быть лег­ко сде­ла­но при по­мо­щи функ­ций <span style="color: #993366;">dispatch_sync</span> и <span style="color: #993366;">dispatch_get_main_queue</span>:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">__block <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>stringValue;<br />
dispatch_sync<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// __block variables aren't automatically retained</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// so we'd better make sure we have a reference we can keep</span><br />
&nbsp; &nbsp; &nbsp;stringValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>textField stringValue<span style="color: #002200;">&#93;</span> copy<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#91;</span>stringValue autorelease<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>// use stringValue in the background now<br />
Прав­да, воз­мож­но, луч­ше все-​та­ки ис­поль­зо­вать асин­хрон­ный стиль на­пи­са­ния ко­да. То есть вме­сто син­хрон­но­го вы­зо­ва, пе­ре­дать по­сыл­ку в глав­ную оче­редь, ко­то­рая, по­сле за­вер­ше­ния, пе­ре­даст по­сыл­ку об­рат­но в фо­но­вую оче­редь. Код бу­дет при­мер­но вот та­кой:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_queue_t bgQueue <span style="color: #002200;">=</span> myQueue;<br />
dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>stringValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>textField stringValue<span style="color: #002200;">&#93;</span> copy<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>bgQueue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// use stringValue in the background now</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>В за­ви­си­мо­сти от то­го, что вам тре­бу­ет­ся, <span style="color: #993366;">myQueue</span> мо­жет быть ли­бо поль­зо­ва­тель­ской оче­ре­дью или од­ной из гло­баль­ных оче­ре­дей.</p>
<h3>Замена блокировок</h3>
<p>Поль­зо­ва­тель­ские оче­ре­ди мо­гут быть ис­поль­зо­ва­ны как ме­ха­низм син­хро­ни­за­ции вме­сто бло­ки­ро­вок (locks). В тра­ди­ци­он­ном мно­го­по­точ­ном про­грам­ми­ро­ва­нии, ес­ли вам необ­хо­ди­мо бы­ло со­зда­вать спе­ци­аль­ные объ­ек­ты, ко­то­рые пред­на­зна­ча­лись для ис­поль­зо­ва­ния в несколь­ких по­то­ках, со­зда­ва­лись спе­ци­аль­ные бло­ки­ров­ки, при по­мо­щи ко­то­рых мож­но бы­ло за­щи­тить до­ступ к та­ко­му об­ще­му объ­ек­ту. Псев­до­код при­ве­ден ни­же:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>something <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">id</span> localSomething;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock lock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;localSomething <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>something retain<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock unlock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">return</span> localSomething;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;</div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSomething<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>newSomething <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock lock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>newSomething <span style="color: #002200;">!=</span> something<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>something release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; something <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>newSomething retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self updateSomethingCaches<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock unlock<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>В GCD пе­ре­мен­ную <span style="color: #993366;">lock</span> мож­но за­ме­не­нить на ло­каль­ную пе­ре­мен­ную ти­па «оче­редь»: <span style="color: #993366;">dispatch_queue_t queue;.</span> Что­бы ис­поль­зо­вать оче­редь как ме­ха­низм син­хро­ни­за­ции, оче­редь долж­на быть поль­зо­ва­тель­ской, а не гло­баль­ной, что­бы мож­но бы­ло ее про­и­ни­ци­а­ли­зи­ро­вать при по­мо­щи <span style="color: #993366;">dispatch_queue_create</span>. По­сле это­го мож­но весь код до­сту­па к об­щим дан­ным внут­ри <span style="color: #993366;">dispatch_sync</span> или <span style="color: #993366;">dispatch_async</span>:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>something <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;__block <span style="color: #a61390;">id</span> localSomething;<br />
&nbsp; &nbsp; &nbsp;dispatch_sync<span style="color: #002200;">&#40;</span>queue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localSomething <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>something retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>localSomething autorelease<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSomething<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>newSomething <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>queue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>newSomething <span style="color: #002200;">!=</span> something<span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>something release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;something <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>newSomething retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self updateSomethingCaches<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Сто­ит от­ме­тить, что оче­ре­ди по­сы­лок ис­клю­чи­тель­но лег­ко­вес­ны, по­это­му ис­поль­зо­ва­ние их в ка­че­стве ме­ха­низ­ма бло­ки­ров­ки пол­но­стью оправ­да­но.<br />
В этом ме­сте вы, долж­но быть, ду­ма­е­те, что это все хо­ро­шо, но в чем смысл? Мы пе­ре­шли с од­но­го ме­ха­низ­ма на дру­гой, ко­то­рый вы­гля­дит при­мер­но та­к­же. За­чем? До­сто­инств у ме­ха­низ­ма GCD несколь­ко:</p>
<ul>
<li>Па­рал­ле­лизм. По­смот­ри­те, как <span style="color: #993366;">-setSomething</span> ис­поль­зу­ет <span style="color: #993366;">dispatch_async</span> во вто­рой вер­сии ко­да. Это обо­зна­ча­ет, что вы­зов из <span style="color: #993366;">-setSomething</span> тут же вер­нет управ­ле­ние и вся осталь­ная ра­бо­та бу­дет вы­пол­не­на в фоне. Это мо­жет быть су­ще­ствен­ным вы­иг­ры­шем, ес­ли <span style="color: #993366;">updateSomethingCaches</span> — за­трат­ная опе­ра­ция, в то вре­мя, как вы­зы­ва­ю­щая функ­ция то­же долж­на бу­дет вы­пол­нить что-​то объ­ем­ное.</li>
<li>Без­опас­ность. Невоз­мож­но слу­чай­но на­пи­сать код, ко­то­рый нераз­бло­ки­ру­ет объ­ект, пред­ва­ри­тель­но его за­бло­ки­ро­вав. В тра­ди­ци­он­ном под­хо­де до­ста­точ­но лег­ко, на­при­мер, по­ста­вить ка­кой-​ни­будь return внутрь ме­то­да, тем са­мым оста­вив бло­ки­ров­ку в «под­ве­шен­ном» со­сто­я­нии.</li>
<li>Кон­троль. Воз­мож­ность при­оста­но­вить и воз­об­но­вить вы­пол­не­ние за­да­ний в оче­ре­дях от­сут­ству­ет при ис­поль­зо­ва­нии тра­ди­ци­он­ных бло­ки­ро­вок. Та­к­же от­сут­ству­ет воз­мож­ность кон­тро­ли­ро­вать при­о­ри­тет вы­пол­не­ния за­дач «внут­ри» бло­ки­ро­вок и ис­пол­не­ния там же ко­да в дру­гих по­то­ках (на­при­мер, в глав­ном по­то­ке, ес­ли это необ­хо­ди­мо).</li>
<li>Ин­те­гра­ция. Со­бы­тий­ная си­сте­ма GCD ин­те­гри­ру­ет­ся с оче­ре­дя­ми со­бы­тий. Лю­бые со­бы­тия или тай­ме­ры, ко­то­рые нуж­ны объ­ек­ту, мо­гут быть пе­ре­на­прав­ле­ны в оче­редь это­го объ­ек­та, та­ким об­ра­зом за­ста­вив их там вы­пол­нять­ся, то есть, ав­то­ма­ти­че­ски «син­хро­ни­зи­ру­ясь» с объ­ек­том.</li>
</ul>
<h4>Заключение</h4>
<p><span style="font-weight: normal;">Те­перь вам из­вест­ны ос­но­вы GCD, про­це­ду­ра со­зда­ния оче­ре­дей, как от­прав­лять за­да­ния в оче­ре­ди и как их ис­поль­зо­вать для син­хро­ни­за­ции вме­сто мно­го­по­точ­ных бло­ки­ро­вок. В сле­ду­ю­щей ча­сти бу­дут по­ка­за­ны тех­ни­ки ис­поль­зо­ва­ния GCD для уве­ли­че­ния про­из­во­ди­тель­но­сти мно­го­ядер­ных си­стем. А по­том зай­мем­ся еще бо­лее глу­бо­ким ана­ли­зом GCD, вклю­чая си­сте­му со­бы­тий и пла­ни­ро­ва­ние оче­ре­дей.</span></p>
<h4>Ресурсы</h4>
<p><span style="font-weight: normal;">Ори­ги­нал ста­тьи: <noindex><a href="http://www.mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html" target="_blank">Intro to Grand Central Dispatch, Part I: Basics and Dispatch Queues</a></noindex></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding SVN revision to Xcode project</title>
		<link>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html</link>
		<comments>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html#comments</comments>
		<pubDate>Wed, 23 Feb 2011 12:43:01 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[RegExp]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1193</guid>
		<description><![CDATA[Просмотр ревизии в самом приложении предотвращает путаницу и всякие проблемы с отслеживанием текущей версии. Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта. 12345678910REVISION=`svnversion -nc &#124; /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` APPVERSION=`/usr/libexec/PlistBuddy -c &#34;Print CFBundleVersion&#34; &#34;${TARGET_BUILD_DIR}&#34;/${INFOPLIST_PATH}` xported=&#34;xported&#34; if &#91; $APPVERSION != $xported &#93;; then &#160; &#160; &#160;/usr/libexec/PlistBuddy -c &#34;Delete :CFBundleDisplayVersion&#34; &#34;${TARGET_BUILD_DIR}&#34;/${INFOPLIST_PATH} &#160; &#160; &#160;/usr/libexec/PlistBuddy -c [...]]]></description>
			<content:encoded><![CDATA[<p>Просмотр ревизии в самом приложении предотвращает путаницу и всякие проблемы с отслеживанием текущей версии.</p>
<p>Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта.</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">REVISION</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">svnversion</span> <span style="color: #660033;">-nc</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/^[^:]*://;s/[A-Za-z]//'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #007800;">APPVERSION</span>=<span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Print CFBundleVersion&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><span style="color: #000000; font-weight: bold;">`</span><br />
<br />
<span style="color: #007800;">xported</span>=<span style="color: #ff0000;">&quot;xported&quot;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$APPVERSION</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #007800;">$xported</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Delete :CFBundleDisplayVersion&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Add :CFBundleDisplayVersion string&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Set :CFBundleDisplayVersion <span style="color: #007800;">$APPVERSION</span>.<span style="color: #007800;">$REVISION</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
<span style="color: #000000; font-weight: bold;">fi</span></div></td></tr></tbody></table></div>
<p>Чтоб добавить скрипт, необходимо выполнить следующие действия:<br />
1. Зажать Ctrl+клик на фаил проекта в дереве проекта<br />
2. Add->New Build Phase -> New Run Script Build Phase<br />
3. Откроется окно в которое нужно вставить скрипт.</p>
<p><span id="more-1193"></span></p>
<p>В самом проекте, пример на сплеш скрине, создаем лейбл и читаем версию программы к примеру как-то так.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Version &quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleDisplayVersion&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleDisplayVersion&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><img src="http://gyazo.com/150e15a5c21dbae21bcb6d5026220da2.png" alt="Adding SVN revision to Xcode project" /></p>
<p>Существует и второй вариант, более простой. (На самом деле можно придумать еще много разных способов.) Добавляем следующий bash скрипт в проект и добавляем фаил revision.h.</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">REV</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">svnversion</span> -n<span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;#define kRevisionNumber @<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #007800;">$REV</span><span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #800000;">${PROJECT_DIR}</span><span style="color: #000000; font-weight: bold;">/</span>revision.h</div></td></tr></tbody></table></div>
<p>Желательно фаил вставить в один какой-то дальний хидер, чтоб при компилировании не пересобирался весь проект. </p>
<p>Для этого варианта можно написать что-то типа этого:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Version &quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleVersion&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleVersion&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span>kRevisionNumber<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Keychain</title>
		<link>http://www.developers-life.com/keychain.html</link>
		<comments>http://www.developers-life.com/keychain.html#comments</comments>
		<pubDate>Fri, 28 Jan 2011 13:32:41 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Keychain]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1188</guid>
		<description><![CDATA[Это только часть статьи, скопировал с habrahabr.ru. Добавил для себя, но может кому-то пригодится тоже. Спасибо автору youROCK. Функции для работы с Keychain достаточно низкоуровневые (в отличие от большинства фреймворков, которые работают с пользовательским интерфейсом), и используют API на языке C. В документации от Apple есть очень объемное руководство по всем вызовам, которые поддерживаются подсистемой [...]]]></description>
			<content:encoded><![CDATA[<p>Это только часть статьи, скопировал с habrahabr.ru. Добавил для себя, но может кому-то пригодится тоже. Спасибо автору youROCK.</p>
<p><a href="http://gyazo.com/5fa5c7952c1956c38f62a18964c30388.png"><img class="alignnone" src="http://gyazo.com/5fa5c7952c1956c38f62a18964c30388.png" alt="" width="368" height="256" /></a></p>
<p>Функции для работы с Keychain достаточно низкоуровневые (в отличие от большинства фреймворков, которые работают с пользовательским интерфейсом), и используют API на языке C. В документации от Apple есть очень объемное руководство по всем вызовам, которые поддерживаются подсистемой Keychain Services, но я бы хотел показать, насколько просто можно делать базовые вещи.</p>
<p>При работе с вызовами на языке C, Apple в основном использует CoreFoundation. CoreFoundation использует и поддерживает практически те же самые типы данных, которые используются в Objective C с фреймворком Cocoa, и даже поддерживает прозрачное приведение типов CoreFoundation <-> Cocoa. Все вызовы CoreFoundation имеют префикс CF (ср. с NS), а имена типов получаются с помощью замены NS на CF и звездочки [*] на суффикс Ref (reference, ссылка) в конец (к примеру, NSString* <-> CFStringRef, NSArray* <-> CFArrayRef). Для работы с памятью используются CFRelease(CFTypeRef) / CFRetain(CFTypeRef), о назначении и способе использования которых можете догадаться сами.<br />
<span id="more-1188"></span><br />
Итак, чтобы начать работу с Keychain, нужно добавить пару заголовков и подключить фреймворк Security.framework:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#import &lt;CoreFoundation/CoreFoundation.h&gt;</span><br />
<span style="color: #6e371a;">#import &lt;Security/Security.h&gt;</span></div></td></tr></tbody></table></div>
<p>Чтобы добавить интернет-пароль для вашего приложения в связку ключей по умолчанию, используйте вызов SecKeychainAddInternetPassword. У него очень много аргументов, большАя из которых не является обязательной. Пример использования находится ниже:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>serverName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;habrahabr.ru&quot;</span>;<br />
<span style="color: #a61390;">int</span> serverNameLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>serverName<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>accountName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;youROCK&quot;</span>;<br />
<span style="color: #a61390;">int</span> accountNameLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>accountName<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;/&quot;</span>;<br />
<span style="color: #a61390;">int</span> pathLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>path<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">int</span> port <span style="color: #002200;">=</span> <span style="color: #2400d9;">22</span>;<br />
<br />
<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>passwordData <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;myExtremelySecretPassword&quot;</span>;<br />
<span style="color: #a61390;">int</span> passwordLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>passwordData<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #11740a; font-style: italic;">/* конечно, протокол может быть другим (не SSH :)), см. описании этой функции в руководстве, в нем можно найти ссылку на список всех поддерживаемых протоколов */</span><br />
<br />
SecKeychainAddInternetPassword<span style="color: #002200;">&#40;</span><span style="color: #a61390;">NULL</span>, serverNameLength, serverName, <span style="color: #2400d9;">0</span>, <span style="color: #a61390;">NULL</span>, accountNameLength, accountName, pathLength, path, port, kSecProtocolTypeSSH, kSecAuthenticationTypeDefault, passwordLength, passwordData, <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Для получения интернет-пароля из Keychain, мы используем вызов SecKeychainFindInternetPassword, пример работы с которым можно увидеть ниже:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>serverName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;habrahabr.ru&quot;</span>;<br />
<span style="color: #a61390;">int</span> serverNameLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>serverName<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>accountName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;youROCK&quot;</span>;<br />
<span style="color: #a61390;">int</span> accountNameLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>accountName<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;/&quot;</span>;<br />
<span style="color: #a61390;">int</span> pathLength <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span style="color: #a61390;">strlen</span></a><span style="color: #002200;">&#40;</span>path<span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #a61390;">int</span> port <span style="color: #002200;">=</span> <span style="color: #2400d9;">22</span>;<br />
<br />
UInt32 passwordLength;<br />
<span style="color: #a61390;">void</span> <span style="color: #002200;">*</span>passwordData;<br />
<br />
OSStatus retVal;<br />
<br />
<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#40;</span>retVal <span style="color: #002200;">=</span> SecKeychainFindInternetPassword<span style="color: #002200;">&#40;</span><span style="color: #a61390;">NULL</span>, serverNameLength, serverName, <span style="color: #2400d9;">0</span>, <span style="color: #a61390;">NULL</span>, accountNameLength, accountName, pathLength, path, port, kSecProtocolTypeSSH, kSecAuthenticationTypeDefault, <span style="color: #002200;">&amp;</span>passwordLength, <span style="color: #002200;">&amp;</span>passwordData, <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// дело в том, что passwordData является (void *) и НЕ СОДЕРЖИТ нулевого символа в конце,</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// поэтому мы используем следующий код, чтобы получить пригодную для использования строку с паролем</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>passValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> alloc<span style="color: #002200;">&#93;</span> initWithBytes<span style="color: #002200;">:</span>passwordData length<span style="color: #002200;">:</span>passwordLength encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// делаем, что хотим с полученным паролем</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; SecKeychainItemFreeContent<span style="color: #002200;">&#40;</span><span style="color: #a61390;">NULL</span>, passwordData<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>passValue release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span><br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// обратите внимание на 2 вещи — во-первых, в названии функции есть copy, а значит нам нужно освободить память самим</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// вторая вещь — мы используем обычное приведение типов (NSString*), чтобы получить указатель на NSString из CFStringRef</span><br />
<br />
&nbsp; &nbsp; CFStringRef reason <span style="color: #002200;">=</span> SecCopyErrorMessageString<span style="color: #002200;">&#40;</span>retVal, <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Could not fetch info from KeyChain, recieved code %d with following explanation: %@&quot;</span>, retVal, <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> reason<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; CFRelease<span style="color: #002200;">&#40;</span>reason<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Заметьте, что мы нигде не предполагали, на какой ОС этот код будет запущен, так что он будет работать и в Mac OS X и в iPhoneOS (причём в iPhoneOS для доступа к Keychain из приложения не требуется подтверждение пользователя).</p>
<p><noindex><a href="http://habrahabr.ru/blogs/macosxdev/83688/">Resource</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/keychain.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xcode Shortcut Documents</title>
		<link>http://www.developers-life.com/xcode-shortcut-documents.html</link>
		<comments>http://www.developers-life.com/xcode-shortcut-documents.html#comments</comments>
		<pubDate>Wed, 03 Nov 2010 20:28:02 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1136</guid>
		<description><![CDATA[You can download the zip file containing the original Pages Documents here. You will need Pages &#8217;09 (part of iWork &#8217;09) in order to open the documents. From: COCOA SAMURAI]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.1729.us/xcode/SnowLeopard/Xcode%20Shortcuts.pdf"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_bMMRN3vt0x0/R8NxKL2TGFI/AAAAAAAAAYE/bXn-0bNpMjQ/s320/Xcode+Shortcuts.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5171101216944625746" /></a></p>
<p><a href="http://1729.us/xcode/SnowLeopard/Xcode_Shortcuts.zip" target="blank">You can download the zip file containing the original Pages Documents here.</a> You will need Pages &#8217;09 (part of iWork &#8217;09) in order to open the documents.</p>
<p>From:<noindex> <a href="http://cocoasamurai.blogspot.com/2009/09/xcode-shortcut-documents-available.html" target="blank">COCOA SAMURAI</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/xcode-shortcut-documents.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips and Tricks II</title>
		<link>http://www.developers-life.com/tips-and-tricks-part-ii.html</link>
		<comments>http://www.developers-life.com/tips-and-tricks-part-ii.html#comments</comments>
		<pubDate>Thu, 28 Oct 2010 16:10:19 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=977</guid>
		<description><![CDATA[Пара-тройка решений маленьких вопросов&#8230; Таким образом можно проверить наличие API на уставленном устройстве Check for presence of GKLocalPlayer API. 1Class gcClass = &#40;NSClassFromString&#40;@&#34;GKLocalPlayer&#34;&#41;&#41;; Один из варианто проверки версии iOS The device must be running running iOS 4.1 or later. 1234NSString *reqSysVer = @&#34;4.1&#34;; NSString *currSysVer = &#91;&#91;UIDevice currentDevice&#93; systemVersion&#93;; BOOL osVersionSupported = &#40;&#91;currSysVer compare:reqSysVer &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Пара-тройка решений маленьких вопросов&#8230;</p>
<p>Таким образом можно проверить наличие API на уставленном устройстве<br />
 Check for presence of GKLocalPlayer API.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">Class</span> gcClass <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>NSClassFromString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GKLocalPlayer&quot;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Один из варианто проверки версии iOS<br />
The device must be running running iOS 4.1 or later.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>reqSysVer <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;4.1&quot;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>currSysVer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemVersion<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">BOOL</span> osVersionSupported <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>currSysVer compare<span style="color: #002200;">:</span>reqSysVer <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options<span style="color: #002200;">:</span>NSNumericSearch<span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> NSOrderedAscending<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Простенькое решение для определения высоты текста с заданными параметрами! Очень полезно, если вам нужно рассчитать размер объекта перед тем как его необходимо отобразить.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span> getHeightOfText<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> text &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forFont<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>UIFont<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>_font &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;withWidtht<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span>width &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mode<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UILineBreakMode<span style="color: #002200;">&#41;</span>lineBreakMode<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp;<br />
&nbsp; CGSize suggestedSize <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>text sizeWithFont<span style="color: #002200;">:</span>withFont <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; constrainedToSize<span style="color: #002200;">:</span>CGSizeMake<span style="color: #002200;">&#40;</span>width, <span style="color: #a61390;">FLT_MAX</span><span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lineBreakMode<span style="color: #002200;">:</span>lineBreakMode<span style="color: #002200;">&#93;</span>;<br />
&nbsp;<br />
&nbsp;<span style="color: #a61390;">return</span> suggestedSize.height;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/tips-and-tricks-part-ii.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Example &#8220;NSPanel with NSProgressIndicator&#8221;</title>
		<link>http://www.developers-life.com/example-nspanel-with-nsprogressindicator.html</link>
		<comments>http://www.developers-life.com/example-nspanel-with-nsprogressindicator.html#comments</comments>
		<pubDate>Fri, 15 Oct 2010 16:09:05 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[NSPanel]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1068</guid>
		<description><![CDATA[It&#8217;s simple. 1. Create NSPanel with indicator in IB 2. Present indicator and launch NSThread with your action method 123456789- &#40;IBAction&#41; push: sender &#123; &#160; &#160; &#160;if &#40;panel == nil&#41; &#123; &#160; &#160; &#160; &#160; &#160; panel = &#91;&#91;PanelWithIndicator alloc&#93; init&#93;; &#160; &#160; &#160;&#125; &#160; &#160; &#160;&#91;NSThread detachNewThreadSelector:@selector&#40;launchThread&#41; &#160; &#160; &#160;toTarget:self &#160; &#160; &#160;withObject:nil&#93;; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s simple.</p>
<p>1. Create NSPanel with indicator in IB<br />
2.  Present indicator and launch NSThread with your action method</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> push<span style="color: #002200;">:</span> sender <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>panel <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panel <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>PanelWithIndicator alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/"><span style="color: #400080;">NSThread</span></a> detachNewThreadSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>launchThread<span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp;toTarget<span style="color: #002200;">:</span>self <br />
&nbsp; &nbsp; &nbsp;withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>panel withParentWindow<span style="color: #002200;">:</span>window<span style="color: #002200;">&#93;</span>; &nbsp; <br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>3. End of action and stop indicator</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stopIndicator <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>panel performSelectorOnMainThread<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>end<span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp;withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> <br />
&nbsp; &nbsp; &nbsp;waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Method <strong>end</strong> in <strong>panel</strong> object</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> end <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self window<span style="color: #002200;">&#93;</span> orderOut<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>NSApp stopModal<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><span id="more-1068"></span><br />
<a href="http://gyazo.com/b9964e8ab9d35a04b42350e1e2cfba2d.png" target="blank"><img class="alignnone" src="http://gyazo.com/b9964e8ab9d35a04b42350e1e2cfba2d.png" alt="" width="326" height="258" /></a></p>
<p><a href="http://depositfiles.com/files/v411ocgr5" target="blank">Source code + 2 pdf book about programming for mac os x and iPhone/iPad</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/example-nspanel-with-nsprogressindicator.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Local Notification Sample Code (OS 4.0 only)</title>
		<link>http://www.developers-life.com/local-notification-sample-code-os-4-0-only.html</link>
		<comments>http://www.developers-life.com/local-notification-sample-code-os-4-0-only.html#comments</comments>
		<pubDate>Sun, 13 Jun 2010 21:34:46 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1051</guid>
		<description><![CDATA[Start a new Window-based Application Project called LocalPush Add an instance variable bgTask in LocalPushAppDelegate Download Sample + 2 books &#8220;iPhoneMemoryManagementFinalVersion&#8221; and &#8220;ES 2.0 Programming Guide&#8221; 1234@interface LocalPushAppDelegate : NSObject &#123; &#160; &#160; UIWindow *window; &#160; &#160; UIBackgroundTaskIdentifier bgTask; &#125; It will fire up a Local Notification to remind you one min before the event [...]]]></description>
			<content:encoded><![CDATA[<p>Start a new Window-based Application Project called LocalPush</p>
<p>Add an instance variable bgTask in LocalPushAppDelegate</p>
<p><a href="http://depositfiles.com/files/tl1knbiq0">Download Sample</a> + 2 books &#8220;iPhoneMemoryManagementFinalVersion&#8221; and &#8220;ES 2.0 Programming Guide&#8221;</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@interface</span> LocalPushAppDelegate <span style="color: #002200;">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UIWindow <span style="color: #002200;">*</span>window;<br />
&nbsp; &nbsp; UIBackgroundTaskIdentifier bgTask;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><a href="http://www.developers-life.com/wp-content/uploads/2010/06/Screen-shot-2010-06-20-at-1.06.08-AM.png" target="_blank"><img class="alignnone size-medium wp-image-1056" title="message from background, iphone OS 4.0" src="http://www.developers-life.com/wp-content/uploads/2010/06/Screen-shot-2010-06-20-at-1.06.08-AM-161x300.png" alt="message from background, iphone OS 4.0" width="161" height="300" /></a></p>
<p>It will fire up a Local Notification to remind you one min before the event which is 2 minutes due from now<br />
<span id="more-1051"></span></p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #11740a; font-style: italic;">//</span><br />
<span style="color: #11740a; font-style: italic;">// LocalPushAppDelegate.m</span><br />
<span style="color: #11740a; font-style: italic;">// LocalPush</span><br />
<span style="color: #11740a; font-style: italic;">//</span><br />
<br />
<span style="color: #a61390;">@interface</span> ToDoItem <span style="color: #002200;">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <span style="color: #002200;">&#123;</span><br />
NSInteger year;<br />
NSInteger month;<br />
NSInteger day;<br />
NSInteger hour;<br />
NSInteger minute;<br />
NSInteger second;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>eventName;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger year;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger month;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger day;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger hour;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger minute;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, readwrite<span style="color: #002200;">&#41;</span> NSInteger second;<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, copy<span style="color: #002200;">&#41;</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>eventName;<br />
<br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #a61390;">@implementation</span> ToDoItem<br />
<span style="color: #a61390;">@synthesize</span> year, month, day, hour, minute, second, eventName;<br />
<span style="color: #a61390;">@end</span><br />
<br />
<br />
<br />
<br />
<span style="color: #6e371a;">#import &quot;LocalPushAppDelegate.h&quot;</span><br />
<br />
<span style="color: #a61390;">@implementation</span> LocalPushAppDelegate<br />
<br />
<span style="color: #a61390;">@synthesize</span> window;<br />
<br />
<span style="color: #6e371a;">#define ToDoItemKey @&quot;EVENTKEY1&quot;</span><br />
<span style="color: #6e371a;">#define MessageTitleKey @&quot;MSGKEY1&quot;</span><br />
<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didFinishLaunchingWithOptions<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>launchOptions <span style="color: #002200;">&#123;</span><br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;application: didFinishLaunchingWithOptions:&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #11740a; font-style: italic;">// Override point for customization after application launch</span><br />
<br />
UILocalNotification <span style="color: #002200;">*</span>localNotif <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>launchOptions<br />
objectForKey<span style="color: #002200;">:</span>UIApplicationLaunchOptionsLocalNotificationKey<span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>localNotif<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>itemName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>localNotif.userInfo objectForKey<span style="color: #002200;">:</span>ToDoItemKey<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #11740a; font-style: italic;">// [viewController displayItem:itemName]; // custom method</span><br />
application.applicationIconBadgeNumber <span style="color: #002200;">=</span> localNotif.applicationIconBadgeNumber<span style="color: #002200;">-</span><span style="color: #2400d9;">1</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;has localNotif %@&quot;</span>,itemName<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span><br />
<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> cancelAllLocalNotifications<span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/"><span style="color: #400080;">NSDate</span></a> <span style="color: #002200;">*</span>now <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/"><span style="color: #400080;">NSDate</span></a> date<span style="color: #002200;">&#93;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;now is %@&quot;</span>,now<span style="color: #002200;">&#41;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/"><span style="color: #400080;">NSDate</span></a> <span style="color: #002200;">*</span>scheduled <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>now dateByAddingTimeInterval<span style="color: #002200;">:</span><span style="color: #2400d9;">120</span><span style="color: #002200;">&#93;</span> ; <span style="color: #11740a; font-style: italic;">//get x minute after</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/"><span style="color: #400080;">NSCalendar</span></a> <span style="color: #002200;">*</span>calendar <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/"><span style="color: #400080;">NSCalendar</span></a> currentCalendar<span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">int</span> unitFlags <span style="color: #002200;">=</span> NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/"><span style="color: #400080;">NSDateComponents</span></a> <span style="color: #002200;">*</span>comp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>calendar components<span style="color: #002200;">:</span>unitFlags fromDate<span style="color: #002200;">:</span>scheduled<span style="color: #002200;">&#93;</span>;<br />
<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;scheduled is %@&quot;</span>,scheduled<span style="color: #002200;">&#41;</span>;<br />
<br />
ToDoItem <span style="color: #002200;">*</span>todoitem <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>ToDoItem alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
<br />
todoitem.day <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>comp day<span style="color: #002200;">&#93;</span>;<br />
todoitem.month <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>comp month<span style="color: #002200;">&#93;</span>;<br />
todoitem.year <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>comp year<span style="color: #002200;">&#93;</span>;<br />
todoitem.hour <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>comp hour<span style="color: #002200;">&#93;</span>;<br />
todoitem.minute <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>comp minute<span style="color: #002200;">&#93;</span>;<br />
todoitem.eventName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Testing Event&quot;</span>;<br />
<br />
<span style="color: #002200;">&#91;</span>self scheduleNotificationWithItem<span style="color: #002200;">:</span>todoitem interval<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;scheduleNotificationWithItem&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#91;</span>window makeKeyAndVisible<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didReceiveLocalNotification<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UILocalNotification <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notif <span style="color: #002200;">&#123;</span><br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;application: didReceiveLocalNotification:&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>itemName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>notif.userInfo objectForKey<span style="color: #002200;">:</span>ToDoItemKey<span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>messageTitle <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>notif.userInfo objectForKey<span style="color: #002200;">:</span>MessageTitleKey<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #11740a; font-style: italic;">// [viewController displayItem:itemName]; // custom method</span><br />
<span style="color: #002200;">&#91;</span>self _showAlert<span style="color: #002200;">:</span>itemName withTitle<span style="color: #002200;">:</span>messageTitle<span style="color: #002200;">&#93;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Receive Local Notification while the app is still running...&quot;</span><span style="color: #002200;">&#41;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;current notification is %@&quot;</span>,notif<span style="color: #002200;">&#41;</span>;<br />
application.applicationIconBadgeNumber <span style="color: #002200;">=</span> notif.applicationIconBadgeNumber<span style="color: #002200;">-</span><span style="color: #2400d9;">1</span>;<br />
<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> _showAlert<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pushmessage withTitle<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>title<br />
<span style="color: #002200;">&#123;</span><br />
<br />
UIAlertView<span style="color: #002200;">*</span> alertView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span>title message<span style="color: #002200;">:</span>pushmessage delegate<span style="color: #002200;">:</span>self cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OK&quot;</span> otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>alertView show<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>alertView<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<span style="color: #002200;">&#91;</span>alertView release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>scheduleNotificationWithItem<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>ToDoItem <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>item interval<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>minutesBefore <span style="color: #002200;">&#123;</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/"><span style="color: #400080;">NSCalendar</span></a> <span style="color: #002200;">*</span>calendar <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/"><span style="color: #400080;">NSCalendar</span></a> autoupdatingCurrentCalendar<span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/"><span style="color: #400080;">NSDateComponents</span></a> <span style="color: #002200;">*</span>dateComps <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/"><span style="color: #400080;">NSDateComponents</span></a> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps setDay<span style="color: #002200;">:</span>item.day<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps setMonth<span style="color: #002200;">:</span>item.month<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps setYear<span style="color: #002200;">:</span>item.year<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps setHour<span style="color: #002200;">:</span>item.hour<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps setMinute<span style="color: #002200;">:</span>item.minute<span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/"><span style="color: #400080;">NSDate</span></a> <span style="color: #002200;">*</span>itemDate <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>calendar dateFromComponents<span style="color: #002200;">:</span>dateComps<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>dateComps release<span style="color: #002200;">&#93;</span>;<br />
<br />
<br />
UILocalNotification <span style="color: #002200;">*</span>localNotif <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILocalNotification alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>localNotif <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span><br />
<span style="color: #a61390;">return</span>;<br />
localNotif.fireDate <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>itemDate dateByAddingTimeInterval<span style="color: #002200;">:-</span><span style="color: #002200;">&#40;</span>minutesBefore<span style="color: #002200;">*</span><span style="color: #2400d9;">60</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;fireDate is %@&quot;</span>,localNotif.fireDate<span style="color: #002200;">&#41;</span>;<br />
localNotif.timeZone <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/"><span style="color: #400080;">NSTimeZone</span></a> defaultTimeZone<span style="color: #002200;">&#93;</span>;<br />
<br />
localNotif.alertBody <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> stringWithFormat<span style="color: #002200;">:</span>NSLocalizedString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@ in %i minutes.&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>,<br />
item.eventName, minutesBefore<span style="color: #002200;">&#93;</span>;<br />
localNotif.alertAction <span style="color: #002200;">=</span> NSLocalizedString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;View Details&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>;<br />
<br />
localNotif.soundName <span style="color: #002200;">=</span> UILocalNotificationDefaultSoundName;<br />
localNotif.applicationIconBadgeNumber <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span>;<br />
<span style="color: #11740a; font-style: italic;">// NSDictionary *infoDict = [NSDictionary dictionaryWithObject:item.eventName forKey:ToDoItemKey];</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> <span style="color: #002200;">*</span>infoDict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span>item.eventName,ToDoItemKey, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Local Push received while running&quot;</span>, MessageTitleKey, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
localNotif.userInfo <span style="color: #002200;">=</span> infoDict;<br />
<br />
<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> scheduleLocalNotification<span style="color: #002200;">:</span>localNotif<span style="color: #002200;">&#93;</span>;<br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;scheduledLocalNotifications are %@&quot;</span>, <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> scheduledLocalNotifications<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#91;</span>localNotif release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> checkForIncomingChat <span style="color: #002200;">&#123;</span><br />
<span style="color: #a61390;">return</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;javacom&quot;</span>;<br />
<span style="color: #002200;">&#125;</span>;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>applicationDidEnterBackground<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application <span style="color: #002200;">&#123;</span><br />
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Application entered background state.&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #11740a; font-style: italic;">// UIBackgroundTaskIdentifier bgTask is instance variable</span><br />
NSAssert<span style="color: #002200;">&#40;</span>self<span style="color: #002200;">-</span>&gt;bgTask <span style="color: #002200;">==</span> UIBackgroundTaskInvalid, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>;<br />
<br />
bgTask <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>application beginBackgroundTaskWithExpirationHandler<span style="color: #002200;">:</span> <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
<span style="color: #002200;">&#91;</span>application endBackgroundTask<span style="color: #002200;">:</span>self<span style="color: #002200;">-</span>&gt;bgTask<span style="color: #002200;">&#93;</span>;<br />
self<span style="color: #002200;">-</span>&gt;bgTask <span style="color: #002200;">=</span> UIBackgroundTaskInvalid;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
<span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>application backgroundTimeRemaining<span style="color: #002200;">&#93;</span> &gt; <span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>friend <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self checkForIncomingChat<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>friend<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
UILocalNotification <span style="color: #002200;">*</span>localNotif <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILocalNotification alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>localNotif<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
localNotif.alertBody <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> stringWithFormat<span style="color: #002200;">:</span><br />
NSLocalizedString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@ has a message for you.&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>, friend<span style="color: #002200;">&#93;</span>;<br />
localNotif.alertAction <span style="color: #002200;">=</span> NSLocalizedString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Read Msg&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>;<br />
localNotif.soundName <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;alarmsound.caf&quot;</span>;<br />
localNotif.applicationIconBadgeNumber <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> <span style="color: #002200;">*</span>infoDict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Your Background Task works&quot;</span>,ToDoItemKey, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Message from javacom&quot;</span>, MessageTitleKey, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
localNotif.userInfo <span style="color: #002200;">=</span> infoDict;<br />
<span style="color: #002200;">&#91;</span>application presentLocalNotificationNow<span style="color: #002200;">:</span>localNotif<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>localNotif release<span style="color: #002200;">&#93;</span>;<br />
friend <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;<br />
<span style="color: #a61390;">break</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#91;</span>application endBackgroundTask<span style="color: #002200;">:</span>self<span style="color: #002200;">-</span>&gt;bgTask<span style="color: #002200;">&#93;</span>;<br />
self<span style="color: #002200;">-</span>&gt;bgTask <span style="color: #002200;">=</span> UIBackgroundTaskInvalid;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span><br />
<span style="color: #002200;">&#91;</span>window release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">@end</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/local-notification-sample-code-os-4-0-only.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Эксперемент</title>
		<link>http://www.developers-life.com/an-experiment.html</link>
		<comments>http://www.developers-life.com/an-experiment.html#comments</comments>
		<pubDate>Sun, 13 Jun 2010 18:54:48 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Jailbreak]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1045</guid>
		<description><![CDATA[Написал простенькую программку ради эксперимента. С помощью программы можно ходит по корневому разделу системы, без Jailbreak. Если кто-то имеет опыт как создать фаил в директории не принадлежащей программе,  без взлома устройства, и поделится! Буду очень признателен! И собственно сам код]]></description>
			<content:encoded><![CDATA[<p>     Написал простенькую программку ради эксперимента. С помощью программы можно ходит по корневому разделу системы, без Jailbreak. Если кто-то имеет опыт как создать фаил в директории не принадлежащей программе,  без взлома устройства, и поделится! Буду очень признателен!</p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2010/06/photo.PNG" target="_blank"><img class="alignnone size-medium wp-image-1046" title="photo" src="http://www.developers-life.com/wp-content/uploads/2010/06/photo-225x300.PNG" alt="photo" width="158" height="210" /></a></p>
<p>И собственно <a href="http://depositfiles.com/files/t9uviw3z0" target="_blank">сам код</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/an-experiment.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

