Objective-c (iOS) Strict Single-case mode is implemented correctly

Source: Internet
Author: User
<span id="Label3"></p><p><p><span style="font-size: 13px;">Note: The title of this article is owned by the author, please specify the source</span>  </p></p><p><p>When you want to use Singleton mode to implement an object of a class in an application that can only exist in one instance, singleton mode is easier to implement in C + + (simply declare the constructor as private). And in Objective-c objects can be generated through nsobject alloc, so you need to write some extra code to ensure the uniqueness of the object, considering that now the iOS app code is almost arc mode, and GCD has been used to rot, therefore, This paper presents an arc version using GCD technology to achieve a strict singleton mode, the specific code is as follows, all the points of attention are written in the Comments:</p></p><pre><span style="color: #008080;"><span style="color: #008080;">1</span></span> <span style="color: #000000;"><span style="color: #000000;">Singleton.h</span></span><span style="color: #008080;"><span style="color: #008080;">2</span></span> <span style="color: #000000;"><span style="color: #000000;">@interface Singleton:nsobject</span></span><span style="color: #008080;"><span style="color: #008080;">3</span></span>@property (nonatomic,strong) NSString *<span style="color: #000000;"><span style="color: #000000;">name;</span></span><span style="color: #008080;"><span style="color: #008080;">4</span></span>+ (singleton*<span style="color: #000000;"><span style="color: #000000;">) defaultmanager;</span></span><span style="color: #008080;"><span style="color: #008080;">5</span></span> <span style="color: #000000;"><span style="color: #000000;">@end</span></span><span style="color: #008080;"><span style="color: #008080;">6</span></span> <span style="color: #008080;"><span style="color: #008080;">7</span></span> <span style="color: #008080;"><span style="color: #008080;">8</span></span> <span style="color: #000000;"><span style="color: #000000;">singleton.m</span></span><span style="color: #008080;"><span style="color: #008080;">9</span></span> <span style="color: #000000;"><span style="color: #000000;">@implementation Singleton</span></span><span style="color: #008080;"><span style="color: #008080;">Ten</span></span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;">a <span style="color: #008000;">static instance object of a singleton class, because the object needs to be unique, so it can only be static type</span></span><span style="color: #008080;"><span style="color: #008080;"></span> one</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>Singleton *defaultmanager =<span style="color: #000000;"><span style="color: #000000;">nil;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span> <span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;"><span style="color: #008000;">* Singleton mode is the only interface for external use, the Dispatch_once function is executed only once within an application, and dispatch_once ensures thread safety</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008000;"><span style="color: #008000;">*/</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>+ (singleton*<span style="color: #000000;"><span style="color: #000000;">) Defaultmanager</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">dispatch_once_t token;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Dispatch_once (&token, ^<span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(defaultmanager = =<span style="color: #000000;"><span style="color: #000000;">Nil)</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;"> {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span>Defaultmanager =<span style="color: #000000;"><span style="color: #000000;">[[self alloc] init];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> at</span> <span style="color: #000000;"><span style="color: #000000;"> });</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">defaultmanager;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;"><span style="color: #008000;">* Overriding this method primarily ensures that when a user creates an object through [[Singleton alloc] init], The Alloc method calls the method, except that the zone parameter defaults to nil, because the class overrides the Allocwithzone method, So memory can only be allocated through its parent class, i.e. [super allocwithzone:zone]</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008000;"><span style="color: #008000;">*/</span></span><span style="color: #008080;"><span style="color: #008080;"></span> in</span>+ (id) Allocwithzone: (<span style="color: #0000ff;"><span style="color: #0000ff;">struct</span></span>_nszone *<span style="color: #000000;"><span style="color: #000000;">) Zone</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> to</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">dispatch_once_t token;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span>Dispatch_once (&token, ^<span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(defaultmanager = =<span style="color: #000000;"><span style="color: #000000;">Nil)</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #000000;"><span style="color: #000000;"> {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> *</span>Defaultmanager =<span style="color: #000000;"><span style="color: #000000;">[super allocwithzone:zone];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> $</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;">Panax Notoginseng</span></span> <span style="color: #000000;"><span style="color: #000000;"> });</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">defaultmanager;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;">the <span style="color: #008000;">Custom Initialization method, in this case, only the name attribute</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span>-<span style="color: #000000;"><span style="color: #000000;">(instancetype) Init</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span>Self =<span style="color: #000000;"><span style="color: #000000;">[super init];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span><span style="color: #000000;"><span style="color: #000000;">(self)</span></span><span style="color: #008080;"><span style="color: #008080;"></span> $</span> <span style="color: #000000;"><span style="color: #000000;"> {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> $</span>Self.name =<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">Singleton</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;">self <span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #008080;"><span style="color: #008080;">Wuyi</span></span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">overriding this method primarily ensures that the Object's uniqueness when the user produces the object through the Copy method</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>-<span style="color: #000000;"><span style="color: #000000;">(id) Copy</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> wu</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;">self <span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> about</span> <span style="color: #008080;"><span style="color: #008080;"></span> $</span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">overriding this method primarily ensures that the Object's uniqueness when the user produces the object through the Mutablecopy method</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>-<span style="color: #000000;"><span style="color: #000000;">(id) mutablecopy</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;">self <span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Custom description Information for log verbose printing</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>-(nsstring *<span style="color: #000000;"><span style="color: #000000;">) Description</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">{</span></span><span style="color: #008080;"><span style="color: #008080;"></span> $</span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span>[nsstring stringwithformat:<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">memeory address:%p,property name:%@</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, self,self.name];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>}</pre><p><p>The test code is as Follows:</p></p><pre><span style="color: #008080;"><span style="color: #008080;">1</span></span>Singleton *defaultmanagersingleton =<span style="color: #000000;"><span style="color: #000000;">[Singleton defaultmanager];</span></span><span style="color: #008080;"><span style="color: #008080;">2</span></span>NSLog (<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">defaultmanagersingleton:\n%@</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, defaultmanagersingleton);</span></span><span style="color: #008080;"><span style="color: #008080;">3</span></span>Singleton *allocsingleton =<span style="color: #000000;"><span style="color: #000000;">[[Singleton alloc] init];</span></span><span style="color: #008080;"><span style="color: #008080;">4</span></span>NSLog (<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">allocsingleton:\n%@</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, allocsingleton);</span></span><span style="color: #008080;"><span style="color: #008080;">5</span></span>Singleton *copysingleton =<span style="color: #000000;"><span style="color: #000000;">[allocsingleton copy];</span></span><span style="color: #008080;"><span style="color: #008080;">6</span></span>NSLog (<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">copysingleton:\n%@</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, copysingleton);</span></span><span style="color: #008080;"><span style="color: #008080;">7</span></span>Singleton *muteblecopysingleton =<span style="color: #000000;"><span style="color: #000000;">[allocsingleton mutablecopy];</span></span><span style="color: #008080;"><span style="color: #008080;">8</span></span>NSLog (<span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">muteblecopysingleton:\n%@</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, muteblecopysingleton);</span></span><span style="color: #008080;"><span style="color: #008080;">9</span></span> <span style="color: #008080;"><span style="color: #008080;">Ten</span></span> <span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Print Results</span></span><span style="color: #008080;"><span style="color: #008080;"></span> one</span> <span style="color: #800080;"><span style="color: #800080;"></span> -</span>-<span style="color: #800080;"><span style="color: #800080;">Ten</span></span>-<span style="color: #800080;"><span style="color: #800080;"></span> one</span> <span style="color: #800080;"><span style="color: #800080;"></span> +</span>:<span style="color: #800080;"><span style="color: #800080;"></span> -</span>:<span style="color: #800080;"><span style="color: #800080;">34.722</span></span>singleton[<span style="color: #800080;"><span style="color: #800080;">1941</span></span>:<span style="color: #800080;"><span style="color: #800080;">214584</span></span><span style="color: #000000;"><span style="color: #000000;">] Defaultmanagersingleton:</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span>Memeory address:<span style="color: #800080;"><span style="color: #800080;">0x7fa6d1591530</span></span><span style="color: #000000;"><span style="color: #000000;">, Property Name:singleton</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #800080;"><span style="color: #800080;"></span> -</span>-<span style="color: #800080;"><span style="color: #800080;">Ten</span></span>-<span style="color: #800080;"><span style="color: #800080;"></span> one</span> <span style="color: #800080;"><span style="color: #800080;"></span> +</span>:<span style="color: #800080;"><span style="color: #800080;"></span> -</span>:<span style="color: #800080;"><span style="color: #800080;">34.727</span></span>singleton[<span style="color: #800080;"><span style="color: #800080;">1941</span></span>:<span style="color: #800080;"><span style="color: #800080;">214584</span></span><span style="color: #000000;"><span style="color: #000000;">] Allocsingleton:</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Memeory address:<span style="color: #800080;"><span style="color: #800080;">0x7fa6d1591530</span></span><span style="color: #000000;"><span style="color: #000000;">, Property Name:singleton</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #800080;"><span style="color: #800080;"></span> -</span>-<span style="color: #800080;"><span style="color: #800080;">Ten</span></span>-<span style="color: #800080;"><span style="color: #800080;"></span> one</span> <span style="color: #800080;"><span style="color: #800080;"></span> +</span>:<span style="color: #800080;"><span style="color: #800080;"></span> -</span>:<span style="color: #800080;"><span style="color: #800080;">34.727</span></span>singleton[<span style="color: #800080;"><span style="color: #800080;">1941</span></span>:<span style="color: #800080;"><span style="color: #800080;">214584</span></span><span style="color: #000000;"><span style="color: #000000;">] Copysingleton:</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Memeory address:<span style="color: #800080;"><span style="color: #800080;">0x7fa6d1591530</span></span><span style="color: #000000;"><span style="color: #000000;">, Property Name:singleton</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #800080;"><span style="color: #800080;"></span> -</span>-<span style="color: #800080;"><span style="color: #800080;">Ten</span></span>-<span style="color: #800080;"><span style="color: #800080;"></span> one</span> <span style="color: #800080;"><span style="color: #800080;"></span> +</span>:<span style="color: #800080;"><span style="color: #800080;"></span> -</span>:<span style="color: #800080;"><span style="color: #800080;">34.727</span></span>singleton[<span style="color: #800080;"><span style="color: #800080;">1941</span></span>:<span style="color: #800080;"><span style="color: #800080;">214584</span></span><span style="color: #000000;"><span style="color: #000000;">] Muteblecopysingleton:</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Memeory address:<span style="color: #800080;"><span style="color: #800080;">0x7fa6d1591530</span></span>, Property Name:singleton</pre><p><p>From the printed results see [Singleton defaultmanager], [[Singleton alloc] init], [allocsingleton copy], [allocsingleton mutablecopy] These four methods generate object addresses are 0x7fa6d1591530, that is, the object is the same, the implementation of strict singleton mode, plus gcd is thread-safe, so in multi-threading can also guarantee the uniqueness of the Object.</p></p><p><p>Another: in the learning objective-c to write a singleton mode, see many people on the net to borrow Apple official implementation way, but I have not found the official implementation of the sample code, if you know the trouble to send me the url, thank you ha ~</p></p><p><p>Objective-c (iOS) Strict Single-case mode is implemented correctly</p></p></span>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.