Single case
and other languages of the singleton production is not much, can be said to be the simplest of a design pattern. But there are a few points to note that a singleton is just one instance of a class.
So we're going to try to stop this class from generating other instances, and the constructor is written as private in the general language. But the functions in OC do not have qualifiers, so we need some tips to block this.
Application Scenarios
A class can have only one instance, and it must be accessed from a well-known access point, such as a factory method.
This unique instance can only be extended by subclasses of the class, and the extended object does not break the client code.
Attention
The instance variable for a singleton in 1.OC is defined in the. m file
A single example in 2.OC requires overloading Allocwithzone: and Copywithzone: Methods to prevent the creation of other instances.
3. Singleton creation be aware of thread safety, or multiple instances may occur.
Note the problem will be explained in the demo
Demo
First of all, let's look at one of the most conventional, non-rigorous single-instance implementations:
@implementation singletonstatic Singleton *sharedinstance;-(Singleton *) sharedinstance{ if (sharedinstance) { sharedinstance = [Singleton new]; } return sharedinstance;} @end
This may seem like a single object, but it can be said to be a variant of the single case. You can't say this is a singleton, because we can easily create objects in other ways.
So we're going to have to modify Allocwithzone: and Copywithzone: Methods (Alloc and copy methods actually call both methods)
-(ID) Copywithzone: (Nszone *) zone{ return [[Self class] sharedinstance];} + (ID) allocwithzone: (struct _nszone *) zone{ return [self sharedinstance];}
However, there is another problem, in the Sharedinstance method we actually call the Allocwithzone: (New Call Alloc), but its alloc is rewritten by us, this will be an error. So we need to modify the Sharedinstance method
+ (Singleton *) sharedinstance{ if (sharedinstance) { sharedinstance = [[Super Allocwithzone:null] init]; } return sharedinstance;}
This allows for a smooth return of the singleton, and it is not possible to produce an instance object in any other way.
It looks perfect. There will be problems actually, because it is now non-thread-safe and there may be instances where more than one instance is created at the same time, so modify the following
+ (instancetype) sharedinstance{ static dispatch_once_t once; Dispatch_once (&once, ^{ sharedinstance = [[Super Allocwithzone:null] init]; }); return sharedinstance;}
The client code is as follows:
Singleton *singleton = [Singleton sharedinstance]; Singleton *singleton2 = [[Singleton alloc] init]; Singleton *singleton3 = [Singleton copy]; [Singleton print]; [Singleton2 print]; [Singleton3 print];
Output Result:
2015-07-21 21:10:32.797 singleton[42537:10347987] 0x7fff5fbff7a82015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a82015-07-21 21:10:32.798 singleton[42537:10347987] 0x7fff5fbff7a8
You can see that the memory is pointing to the same address.
Objective-c design Pattern--Singleton Singleton (object creation)