在Objective-C中使用单例

时间:2012-10-28 14:30:29

标签: ios singleton

有很多像我一样的人正在使用这样的网站(以及其他网站)来教他们自己的iOS和Xcode。那里有很多信息,介于我和我买的书之间,我学到了很多东西,差不多完成了我的第一个应用程序。我需要访问四个NSMutableArrays来将信息从一个UIViewController传递到另一个UIViewController以显示在UITableView中。

问题是关于单身人士(以及appDelegate中的全局变量)的信息是多变的,并且对于一个吵闹的程序员而言是混乱的。在哪里可以找到有关这两种在应用程序内和UIView控制器之间共享信息的方式的清晰,准确和完整的信息?

感谢。

2 个答案:

答案 0 :(得分:2)

(首先,我觉得有必要指出,这不是你应该用来在多个视图控制器中提供数据的方式。)

Objective-C中没有全局变量。至少不是'app-wide'。您可以通过以下方式声明“文件范围”变量:

static NSArray *_array;

但您只能在同一个文件中访问它。要使其在其他类中可访问,您必须创建类方法来执行此操作(至少据我所知):

+ (NSArray *)array
{
    return array;
}

+ (void)setArray:(NSArray *)array
{
    _array = array;
}

(当然你还需要在头文件中声明类方法。

单例模式可以像这样实现:

@interface SomeClass : NSObject 

@property(nonatomic,retain)NSArray *array; 

+(SomeClass*)sharedInstance;    

@end  



@implementation SomeClass    

static SomeClass *instance =nil;    
+(SomeClass *)sharedInstance    
{    
    @synchronized(self)    
    {    
        if(instance == nil)    
        {    
            instance= [[SomeClass alloc] init];    
        }    
    }    
    return instance;    
}  

然后您可以通过调用:

来访问该数组
[[SomeClass] sharedInstance].array

答案 1 :(得分:0)

你可以使用静态(如在另一个答案中)或“单身”声明,它将完成这项工作。这不是真正的单身人士,但它是这样的:

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSArray* arr1 = app.arr1;
if(!arr1) {
    // .. init the arr1 here
    NSArray* tmp = ...
    app.arr1 = tmp;
}

当然最好在AppDelegate本身中覆盖setArr1方法,但这取决于它。