<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Objective-C on Nabeel's - iOS Developer Blog</title><link>https://nabeelarif.github.io/tags/objective-c/</link><description>Recent content in Objective-C on Nabeel's - iOS Developer Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 25 Oct 2016 00:00:00 +0000</lastBuildDate><atom:link href="https://nabeelarif.github.io/tags/objective-c/index.xml" rel="self" type="application/rss+xml"/><item><title>atomic vs nonatomic properties in Objective-C</title><link>https://nabeelarif.github.io/p/atomic-vs-nonatomic-properties-in-objective-c/</link><pubDate>Tue, 25 Oct 2016 00:00:00 +0000</pubDate><guid>https://nabeelarif.github.io/p/atomic-vs-nonatomic-properties-in-objective-c/</guid><description>&lt;img src="https://nabeelarif.github.io/" alt="Featured image of post atomic vs nonatomic properties in Objective-C" /&gt;&lt;p&gt;The difference between atomic and non atomic properties remained a favourite question for interviewers. Today we will analyse these keywords in detail. These keyword define the characteristics of how these properties will behave once they will be accessed from multiple threads simultaneously.&lt;/p&gt;
&lt;h1 id="atomic-default"&gt;atomic (Default)
&lt;/h1&gt;&lt;p&gt;As the word explains itself, a single thread will be able to access the property at a given time. To explain more, only one thread will be able to access getter/setter of a property. Other threads have to wait until first thread releases get/set method. Let&amp;rsquo;s say we have a property firstName which is atomic.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Thread &lt;span class="nv"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; obj.firstName&lt;span class="o"&gt;=&lt;/span&gt;@&lt;span class="s2"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Thread &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; obj.firstName&lt;span class="o"&gt;=&lt;/span&gt;@&lt;span class="s2"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Thread &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; NSLog&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;First Name: %@&amp;#34;&lt;/span&gt;,obj.firstName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It will ensure that the value of property remains consistent throughout the lifecycle. By default all properties are atomic.&lt;/p&gt;
&lt;p&gt;Example atomic property:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@property &lt;span class="o"&gt;(&lt;/span&gt;strong,atomic&lt;span class="o"&gt;)&lt;/span&gt; NSString *firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OR
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@property &lt;span class="o"&gt;(&lt;/span&gt;strong&lt;span class="o"&gt;)&lt;/span&gt; NSString *firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Sample getter setter:
This is how the methods of a property will look for an atomic property after&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@synthesize &lt;span class="nv"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; _firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&lt;span class="o"&gt;(&lt;/span&gt;NSString *&lt;span class="o"&gt;)&lt;/span&gt;firstName&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @synchronized &lt;span class="o"&gt;(&lt;/span&gt;self&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; _firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&lt;span class="o"&gt;(&lt;/span&gt;void&lt;span class="o"&gt;)&lt;/span&gt;setFirstName:&lt;span class="o"&gt;(&lt;/span&gt;NSString *&lt;span class="o"&gt;)&lt;/span&gt;firstName&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @synchronized &lt;span class="o"&gt;(&lt;/span&gt;self&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;_firstName !&lt;span class="o"&gt;=&lt;/span&gt; firstName&lt;span class="o"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;_firstName release&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;_firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;firstName retain&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Note: the Objective-C 2.0 specification, mentions that locks are used internally, but it doesn&amp;rsquo;t specify exactly how. What you see above, is roughly what an atomic getter/setter would look like, but it might not be accurate.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Ensures that user gets a valid value and not some garbage&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; Slow, as it has code to ensure read write safety&lt;/p&gt;
&lt;h1 id="nonatomic"&gt;nonatomic
&lt;/h1&gt;&lt;p&gt;For non atomic properties multiple threads can access the properties simultaneously, so there is always a risk of inconsistency between values&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@property &lt;span class="o"&gt;(&lt;/span&gt;strong,nonatomic&lt;span class="o"&gt;)&lt;/span&gt; NSString *firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Sample getter setter:
This is how the methods of a properties will look for an atomic property&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@synthesize &lt;span class="nv"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; _firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&lt;span class="o"&gt;(&lt;/span&gt;NSString *&lt;span class="o"&gt;)&lt;/span&gt;firstName&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; _firstName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&lt;span class="o"&gt;(&lt;/span&gt;void&lt;span class="o"&gt;)&lt;/span&gt;setFirstName:&lt;span class="o"&gt;(&lt;/span&gt;NSString *&lt;span class="o"&gt;)&lt;/span&gt;firstName&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;_firstName !&lt;span class="o"&gt;=&lt;/span&gt; firstName&lt;span class="o"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;_firstName release&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;_firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;firstName retain&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Pros:&lt;/em&gt; Fast as compared to atomic properties, as there is no extra code to control access of multiple threads&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cons:&lt;/em&gt; You are not guaranteed whether or not you will receive a valid value&lt;/p&gt;
&lt;h1 id="todo"&gt;TODO
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;[] Thread safe vs Read/Write Safe&lt;/li&gt;
&lt;li&gt;[] When is code created for properties i.e how &amp;amp; getter and setter code is created?&lt;/li&gt;
&lt;li&gt;[] When to use atomic vs non-atomic some solid rules?&lt;/li&gt;
&lt;li&gt;[] Detailed Pros &amp;amp; Cons&lt;/li&gt;
&lt;li&gt;[] Multi-threading on Single CPU vs Multiple threads&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="further-reading"&gt;Further Reading
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://realm.io/news/tmi-objective-c-property-attributes/" target="_blank" rel="noopener"
 &gt;TMI #1: Objective-C Property Attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://rypress.com/tutorials/objective-c/properties" target="_blank" rel="noopener"
 &gt;Ry’s Objective-C Tutorial - Properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html" target="_blank" rel="noopener"
 &gt;Apple&amp;rsquo;s Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://stackoverflow.com/a/21802205/800848" target="_blank" rel="noopener"
 &gt;Gabriele Petronella&amp;rsquo;s Answer for Explicit getters/setters for @properties (MRC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.cocoawithlove.com/2009/10/memory-and-thread-safe-custom-property.html" target="_blank" rel="noopener"
 &gt;Memory and thread-safe custom property methods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>synthesize vs dynamic in Objective-C</title><link>https://nabeelarif.github.io/p/synthesize-vs-dynamic-in-objective-c/</link><pubDate>Tue, 25 Oct 2016 00:00:00 +0000</pubDate><guid>https://nabeelarif.github.io/p/synthesize-vs-dynamic-in-objective-c/</guid><description>&lt;p&gt;At the core of Object Orientation you should not access data directly, instead you should use accessor methods to get or set the data. In Objective-C @property directive is a simplified way in which developers can tell the compiler about the behavior required for the accessor methods, which is simple and brief.&lt;/p&gt;
&lt;p&gt;Now the question arise, where are the accessor methods? This leads us to the key words which are our topic today i.e @synthesize and @dynamic.&lt;/p&gt;
&lt;h1 id="synthesize"&gt;@synthesize
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@synthesize &lt;span class="nv"&gt;propertyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; _propertyName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;@synthesize tells the compiler to take care of the accessor methods creation i.e it will generate the methods based on property description. It will also generate an instance variable to be used which you can specify as above, as a convention it starts with _(underscore)+propertyName.&lt;/p&gt;
&lt;h1 id="dynamic"&gt;@dynamic
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@dynamic propertyName&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;mentioning @dynamic with a propertyName tells the compiler not to create accessor methods because user will provide the implementation dynamically in future. Apple allows its developers to provide method implementation at runtime using &lt;a class="link" href="https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html" target="_blank" rel="noopener"
 &gt;Dynamic Method Resolution&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="further-reading"&gt;Further Reading
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html" target="_blank" rel="noopener"
 &gt;Dynamic Method Resolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences" target="_blank" rel="noopener"
 &gt;@synthesize vs @dynamic, what are the differences?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Dispatch Objects in GCD</title><link>https://nabeelarif.github.io/p/dispatch-objects-in-gcd/</link><pubDate>Wed, 30 Mar 2016 00:00:00 +0000</pubDate><guid>https://nabeelarif.github.io/p/dispatch-objects-in-gcd/</guid><description>&lt;p&gt;Grand Central Dispatch (GCD) is a technology by Apple to manage multiple cores of hardware at system level. As GCD is built at lower level and closer to unix system, it can manage muliple cores and developer do not have to worry about it. GCD provides a set of APIs which a developer can use to submit code blocks (dispatch objects) to it, after that GCD can do its magic.&lt;/p&gt;
&lt;h1 id="dispatch-object-lifecycle"&gt;Dispatch Object lifecycle
&lt;/h1&gt;&lt;p&gt;When compiled with Objective-C compiler dispatch objects behave like normal Objective-C objects. They are reatained and then released at the end of their lifecycle automatically in ARC.&lt;/p&gt;
&lt;h1 id="further-readings"&gt;Further Readings
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/" target="_blank" rel="noopener"
 &gt;Grand Central Dispatch (GCD) Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OCLint integration in XCode with xctool</title><link>https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/</link><pubDate>Mon, 28 Mar 2016 00:00:00 +0000</pubDate><guid>https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/</guid><description>&lt;p&gt;In a hurry to do things fast and meet monster deadlines, developers keep the book of best practices aside and start coding. The result can lead to unexpected behavior in your project along with highly unmanaged code. Start following best practices of coding, with time it will become a habit.&lt;/p&gt;
&lt;p&gt;Even the experienced programmers sometimes can&amp;rsquo;t foresee the issues embedded in their code.&lt;/p&gt;
&lt;p&gt;OCLint comes with a huge list of options which are way too lengthy anc can&amp;rsquo;t be covered in a single reading. In this tutorial we will cover best configurations suggested by OCLint documentation for XCode project.&lt;/p&gt;
&lt;h2 id="about-oclint"&gt;About OCLint
&lt;/h2&gt;&lt;!--OCLInt stands for ??, developed by person company.--&gt;
&lt;p&gt;&lt;a class="link" href="http://oclint.org/" target="_blank" rel="noopener"
 &gt;OCLint&lt;/a&gt; is a static analyzer for C, C++ and objective c. The &lt;a class="link" href="http://docs.oclint.org/en/stable/" target="_blank" rel="noopener"
 &gt;documentation&lt;/a&gt; to kick off your relationship with OCLint is huge and you will be jumping from one page to another in pursuit of something, something digestible. In this tutorial our goal is to Install, Integrate &amp;amp; View Analysis report of OCLint in XCode objective-c project.&lt;/p&gt;
&lt;h2 id="prerequisite"&gt;Prerequisite
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://brew.sh/" target="_blank" rel="noopener"
 &gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/facebook/xctool" target="_blank" rel="noopener"
 &gt;xctool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XCode&lt;/li&gt;
&lt;li&gt;OSX&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;h3 id="1-homebrew-easy-and-recommended"&gt;1. Homebrew, Easy and Recommended
&lt;/h3&gt;&lt;p&gt;If &lt;a class="link" href="http://brew.sh/" target="_blank" rel="noopener"
 &gt;homebrew&lt;/a&gt; is configured on your system, you can use &lt;a class="link" href="https://github.com/oclint/homebrew-formulae" target="_blank" rel="noopener"
 &gt;homebrew tap&lt;/a&gt; for oclint.&lt;/p&gt;
&lt;p&gt;{% highlight text %}
$ brew tap oclint/formulae
$ brew install oclint
{% endhighlight %}&lt;/p&gt;
&lt;p&gt;And can be simplified to&lt;/p&gt;
&lt;p&gt;{% highlight text %}
$ brew install oclint/formulae/oclint
{% endhighlight %}&lt;/p&gt;
&lt;p&gt;Use following commands to update to latest version&lt;/p&gt;
&lt;p&gt;{% highlight text %}
$ brew update
$ brew upgrade oclint
{% endhighlight %}&lt;/p&gt;
&lt;h3 id="2-download"&gt;2. Download
&lt;/h3&gt;&lt;p&gt;Ignore it if you have completed installation via Homebrew.&lt;/p&gt;
&lt;p&gt;Go to &lt;a class="link" href="https://github.com/oclint/oclint/releases" target="_blank" rel="noopener"
 &gt;OCLint Releases&lt;/a&gt; on github and download latest oclint-{versionno-architecture-OS}.zip/.tar.zip. Extract the files.&lt;/p&gt;
&lt;p&gt;{% highlight text %}
-oclint-x.y.z
|&amp;ndash;LICENSE
|&amp;ndash;bin (Contains OCLint commands, from here you can execute it)
|&amp;ndash;lib (Contains clang static analyzer, reporters and rules library)
{% endhighlight %}&lt;/p&gt;
&lt;h3 id="set-path"&gt;Set Path
&lt;/h3&gt;&lt;p&gt;Once installation is complete you can set path in terminal&lt;/p&gt;
&lt;p&gt;{% highlight text %}
OCLINT_HOME=/path/to/oclint-x.y.z
export PATH=$OCLINT_HOME/bin:$PATH
{% endhighlight %}&lt;/p&gt;
&lt;h3 id="verify-installation"&gt;Verify Installation
&lt;/h3&gt;&lt;p&gt;Check whether installation is successful. If you see the output listed below, congratulations you did it.&lt;/p&gt;
&lt;p&gt;{% highlight text %}
$ oclint
oclint: Not enough positional command line arguments specified!
Must specify at least 1 positional arguments: See: oclint -help
{% endhighlight %}&lt;/p&gt;
&lt;h2 id="oclint-commands"&gt;OCLint Commands
&lt;/h2&gt;&lt;h3 id="1-oclint"&gt;1. oclint
&lt;/h3&gt;&lt;p&gt;OCLint comes with rich set of options which you can use with &amp;lsquo;oclint&amp;rsquo; command. In terminal type &lt;code&gt;$ ocline --help&lt;/code&gt; to get detailed list of configurations.&lt;/p&gt;
&lt;h3 id="2-oclint-json-compilation-database"&gt;2. oclint-json-compilation-database
&lt;/h3&gt;&lt;p&gt;It is great that OCLint provides us options to specify each file&amp;rsquo;s configurations. But in practical life our projects contains hundreds of files and it will give you a headache to do this manually. Here comes the solution &lt;code&gt;oclint-json-compilation-database&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="integration-with-xcode"&gt;Integration with XCode
&lt;/h2&gt;&lt;p&gt;&lt;img alt="1. Create a new aggregate Target" class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="1172" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget.png" srcset="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget_hu_1297f44b26557aaf.png 800w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget_hu_ac25edc7adf2fb0b.png 1600w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget.png 2280w" width="2280"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Name the target OCLint." class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="1172" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget2.png" srcset="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget2_hu_d635f17b4c3f6368.png 800w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget2_hu_466f2fbde46c4937.png 1600w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/XCodeNewAggregateTarget2.png 2278w" width="2278"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Add new runscript." class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/AddNewRunScript.png" srcset="https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/AddNewRunScript_hu_6e44c9cf3cd60c20.png 800w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/AddNewRunScript_hu_cc062baa33d0ecc5.png 1600w, https://nabeelarif.github.io/p/oclint-integration-in-xcode-with-xctool/AddNewRunScript.png 1990w" width="1990"&gt;&lt;/p&gt;
&lt;p&gt;Add the following script to new run script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Building &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;maxPriority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;15000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Add OCLint bin directory to PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/Cellar/oclint/0.10.2/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Set Build path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BUILD_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_TEMP_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Check whether OCLint exists or not&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; oclint &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; -eq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OCLint not found, analyzing stopped&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OCLint is installed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Navigate to build path directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -f compile_commands.json &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;compile_commands.json not found, possibly clean was performed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Removing compile_commands.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm compile_commands.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# clean previous output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f xcodebuild.log &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Removing xcodebuild.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm xcodebuild.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SRCROOT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Clean, Build and generate compile_commands.json project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xctool -project DemoOCLintTargetInProject.xcodeproj &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-configuration Debug -scheme DemoOCLintTargetInProject &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-sdk iphonesimulator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-reporter json-compilation-database:&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/compile_commands.json clean build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Starting analyzing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BUILD_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oclint-json-compilation-database -v -e Pods oclint_args &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;-max-priority-1=&lt;/span&gt;&lt;span class="nv"&gt;$maxPriority&lt;/span&gt;&lt;span class="s2"&gt; -max-priority-2=&lt;/span&gt;&lt;span class="nv"&gt;$maxPriority&lt;/span&gt;&lt;span class="s2"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;-max-priority-3=&lt;/span&gt;&lt;span class="nv"&gt;$maxPriority&lt;/span&gt;&lt;span class="s2"&gt; -rc LONG_LINE=500 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;-rc LONG_VARIABLE_NAME=100 -disable-rule=UnusedMethodParameter&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/\(.*\.\m\{1,2\}:[0-9]*:[0-9]*:\)/\1 warning:/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="sample-project"&gt;Sample project
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/nabeelarif/DemoOCLintTargetInProject" target="_blank" rel="noopener"
 &gt;DemoOCLintTargetInProject&lt;/a&gt; is the project we used for above demo and is published on git.&lt;/p&gt;
&lt;!--#Where to go from here?--&gt;
&lt;!----&gt;
&lt;!--#Wanna Master OCLint?--&gt;
&lt;!----&gt;
&lt;!--#TODO--&gt;
&lt;!--- http://codingfingers.com/index.html%3Fp=11065.html--&gt;
&lt;!--- https://gavrix.wordpress.com/2013/02/28/integrating-oclint-in-xcode/--&gt;</description></item></channel></rss>