Objective c iOS5中的单身?
您好,我为singleton实现了以前版本的iOS,如下所示: .h文件Objective c iOS5中的单身?,objective-c,ios5,singleton,Objective C,Ios5,Singleton,您好,我为singleton实现了以前版本的iOS,如下所示: .h文件 @interface CartSingleton : NSObject { } +(CartSingleton *) getSingleton; .m文件 @implementation CartSingleton static CartSingleton *sharedSingleton = nil; +(CartSingleton *) getSingleton { if (sharedSinglet
@interface CartSingleton : NSObject
{
}
+(CartSingleton *) getSingleton;
.m文件
@implementation CartSingleton
static CartSingleton *sharedSingleton = nil;
+(CartSingleton *) getSingleton
{
if (sharedSingleton !=nil)
{
NSLog(@"Cart has already been created.....");
return sharedSingleton;
}
@synchronized(self)
{
if (sharedSingleton == nil)
{
sharedSingleton = [[self alloc]init];
NSLog(@"Created a new Cart");
}
}
return sharedSingleton;
}
//==============================================================================
+(id)alloc
{
@synchronized([CartSingleton class])
{
NSLog(@"inside alloc");
NSAssert(sharedSingleton == nil, @"Attempted to allocate a second instance of a singleton.");
sharedSingleton = [super alloc];
return sharedSingleton;
}
return nil;
}
//==============================================================================
-(id)init
{
self = [super init];
}
然而,在web上,我看到人们使用以下代码实现了Singleton设计模式:
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
请有经验的人指导我。
我是一个新手,完全搞不清Singleton的旧iOS实现和新iOS实现,哪一个是正确的
非常感谢dispatch\u once代码段在功能上与其他代码段完全相同。你可以在网站上阅读 这就是我对单身人士的看法:
+ (MySingleton*) getOne {
static MySingleton* _one = nil;
@synchronized( self ) {
if( _one == nil ) {
_one = [[ MySingleton alloc ] init ];
}
}
return _one;
}
注意:在大多数情况下,您甚至不需要使用@synchronized(但这样做是安全的)。严格来说,您必须使用:
+ (MySingleton*) instance {
static dispatch_once_t _singletonPredicate;
static MySingleton *_singleton = nil;
dispatch_once(&_singletonPredicate, ^{
_singleton = [[super allocWithZone:nil] init];
});
return _singleton;
}
+ (id) allocWithZone:(NSZone *)zone {
return [self instance];
}
现在您可以保证不能调用alloc/init并创建另一个实例
说明:实例方法位于类级别,是获取单例引用的主要访问方法。该方法只使用dispatch_once()内置队列,该队列只执行一次块。运行时如何保证块只执行一次?使用您提供的谓词(类型为dispatch\u once\t)。这个低级调用将保证即使有多个线程试图调用它,也只有一个线程成功,其他线程等待第一个线程完成后返回
我们重写allocWithZone的原因是alloc调用allocWithZone,将nil作为区域传递(对于默认区域)。为了防止恶意代码分配和初始化另一个实例,我们重写allocWithZone,以便传回的实例是已经初始化的单例。这会阻止创建第二个实例。单例是一种特殊类型的类,其中当前进程只存在该类的一个实例。(对于iPhone应用程序,一个实例在整个应用程序中共享。)UIKit中的一些示例有[UIApplication sharedApplication](返回应用程序本身的唯一实例)和[NSFileManager defaultManager](返回文件管理器实例)。单件是在整个应用程序中共享数据和常用方法的一种简单方式 您将调用一个将返回singleton对象的类方法,而不是使用alloc/init创建singleton类的实例。您可以为类方法命名任何名称,但通常的做法是将其命名为sharedName或defaultName 请检查一个最佳答案的链接
:有关更现代、更简单但仍然是线程安全的代码,请参阅。有人能更详细地解释此代码以改进答案吗?希望解释能有所帮助。否则,请问一个具体的问题来澄清。我认为你不需要allocWithZone——在单一方法中有许多这样的“漏洞”,苹果在WWDC建议只使用第一种方法,忘记所有的模板覆盖来尝试抓住“骗子”。反正是我的回忆,很好的解释。谢谢!如果您不在其他地方使用@syncrhonized,这将为处理ObjectiveC异常带来巨大的开销-因此,如果您不使用它们,则应使用所选答案和块版本。