2

我正在构建一个应用程序,我的很多视图只显示一次。所以我正在做这个:

+(listNewController *) singleton
{
    return _singleton;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    _singleton = self;

在某处

- (void)viewDidUnload
{
    _singleton = nil;

现在,我不仅获得了对我的单个 ViewController 的很好的引用,我还可以做一些代码保护以确保仅当 _singleton == nil 时才调用 viewDidLoad。

但是大多数人将他们的 ViewController 的引用放在应用程序委托上而不是单例上。

为什么?

到底有什么优点和缺点?

4

2 回答 2

0

首先,我不确定大多数人是否将引用放在应用程序委托中。大多数初学者肯定会这样做,因为当您创建项目时应用程序委托就在那里,这是唯一可以从代码中的任何位置访问的对象,而无需执行任何其他操作。

缺点主要是这不是最好的做法,只是因为方便就将所有东西都放在那里。App Delegate 就是这样一个委托对象,它执行与应用程序生命周期相关的操作,而不是全局变量的容器。因此,仅在委托中存储与该委托的角色无关的内容违反了封装的概念。

在您的情况下,您使用单例来返回视图控制器的单个实例。我也不确定这是否是最好的方法。在多个视图控制器的情况下,在您的特定场景中效果很好的东西是不可重用的。由于这种类要被多次实例化,如果有意义的话,将其定义为单例是不合适的。

在我看来,如果您创建一个单独的单例类(如 MyViewControllersSingleton)会更好,您可以在其中引用不同的唯一控制器作为属性。可以从任何地方以相同的方式调用单例对象:

[MyViewControllersSingleton sharedInstance].listNewController;

对于大多数应用程序,我通常将大部分全局变量和指向唯一视图控制器的指针放在一个单例中,我称之为 AppSingleton。但是,如果您想要更好地分离关注点,您可以想象创建多个单例。

于 2012-06-03T08:04:37.740 回答
-1

我不确定提问者试图解决什么问题,但只是发布了我用来制作单例的两种可能方法:

方法1,使用+load

@class MyClass

static MyClass * __instance = nil ;

+(void)load
{
    @autoreleasepool {
        __instance = [ [ self alloc ] init ] ;  // (use your designated initializer)
    }
}

+(MyClass*)sharedInstance
{
    return __instance ;
}

@end

方法二、延迟初始化:

@implementation MyClass

+(MyClass*)sharedInstance
{
    @synchronized( self )
    {
        if ( !__instance )
        {
            __instance = [ [ self alloc ] init ] ;  // (use your designated initializer)
        }

        return __instance ;
    }
}

@end

对于视图控制器案例,试试这个:

@implementation MyViewController 

static MyViewController * __instance = nil ;

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
    @synchronized( [ self class ] )
    {
        self = __instance ;
        if ( !self )
        {
            self = [ super initWithNibName:nibName bundle:nibBundle ] ;
            __instance = self ;
        }
    }

    // ...finish init as normal here

    return self ;
}

@end
于 2012-06-03T08:18:18.607 回答