Joh*_*Doe 53
好的appDev,您可能会在网上找到很多不同的技术.但是,对于iOS应用程序开发,我认为最方便的方法是执行以下操作:
编写获取单例对象的方法.(建议:dispatch_once为此使用线程和GCD).
将您的方法包装在宏中并将其添加到您的$Project$-Prefix.pch文件中.
每当需要一个类的单例对象时,调用一行宏.
例:
CommonMacros.h:
#define SINGLETON_FOR_CLASS(classname)
+ (id) shared##classname {
static dispatch_once_t pred = 0;
static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
Run Code Online (Sandbox Code Playgroud)
YourProject-Prefix.pch:
...
#import "CommonMacros.h"
...
Run Code Online (Sandbox Code Playgroud)
YourSingletonClass.m:
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
Run Code Online (Sandbox Code Playgroud)
Sac*_*hag 27
查看此链接以获取原始来源 - http://getsetgames.com/2009/08/30/the-objective-c-singleton/
@implementation MySingleton
static MySingleton *_sharedMySingleton = nil;
+(MySingleton *)sharedMySingleton {
@synchronized([MySingleton class]) {
if (!_sharedMySingleton)
_sharedMySingleton = [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
Abh*_*jit 22
我认为这就是我们如何才能真正实现单身行为:
@interface SampleSingletonClass : NSObject
+ sharedSampleSingletonClass;
@end
@implementation SampleSingletonClass
static SampleSingletonClass *singletonObject = nil;
+ (id) sharedSampleSingletonClass
{
if (! singletonObject) {
singletonObject = [[SampleSingletonClass alloc] init];
}
return singletonObject;
}
- (id)init
{
if (! singletonObject) {
singletonObject = [super init];
// Uncomment the following line to see how many times is the init method of the class is called
// NSLog(@"%s", __PRETTY_FUNCTION__);
}
return singletonObject;
}
@end
Run Code Online (Sandbox Code Playgroud)
这里即使一个调用init方法而不是预期的+(id)SampleSingletonClass; 方法实际对象在整个应用程序的生命周期中只形成一次.
Chr*_*ris 12
这是我个人最喜欢的方式:
+ (instancetype)sharedObject {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
Run Code Online (Sandbox Code Playgroud)
Amu*_*lya 11
您可以在Objective-C中实现单例类.
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
http://www.galloway.me.uk/tutorials/singleton-classes/
来自: http ://www.galloway.me.uk/tutorials/singleton-classes/
Objective-C中的单身人士
在为iOS开发时,我最常用的设计模式之一是单例模式.这是一种非常强大的方法,可以在代码的不同部分之间共享数据,而无需手动传递数据.
背景
单例类是一个需要理解的重要概念,因为它们表现出非常有用的设计模式.这个想法在整个iPhone SDK中使用,例如,UIApplication有一个名为sharedApplication的方法,当从任何地方调用时,它将返回与当前运行的应用程序相关的UIApplication实例.
如何实施
Singletone.h
#import <foundation/Foundation.h>
@interface Singleton : NSObject {
}
@property (nonatomic, retain) NSString *someProperty;
+ (id)sharedManager;
@end
Run Code Online (Sandbox Code Playgroud)
Singleton.m
#import "Singleton.h"
@implementation Singleton
@synthesize someProperty;
#pragma mark Singleton Methods
+ (id)sharedManager {
static Singleton *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
它的作用是定义一个名为sharedMyManager的静态变量(但只对该转换单元是全局的)),然后在sharedManager中初始化一次且仅初始化一次.我们确保仅创建一次的方式是使用Grand Central Dispatch(GCD)中的dispatch_once方法.这是线程安全的,完全由操作系统为您处理,因此您根本不必担心它.
| 归档时间: |
|
| 查看次数: |
78536 次 |
| 最近记录: |