为Xcode 4创建/使用Singleton NSMutableArray的正确方法

时间:2012-01-19 19:02:32

标签: iphone objective-c xcode

我已经回顾过(和尝试过)一些关于Singletons和NSMutableArrays的线程。我是Objective-C的新手所以请耐心等待。

我只是想创建一些可以从任何视图/ .m文件访问的数组。

单身人士的最佳(或最简洁)编码是什么?

以下是我现在所拥有的内容 在.m'@implementation'发出1次警告 - “不完整的实施” 在视图.m文件中使用1个错误 - “初始化元素不是编译时常量”

这是我现在的代码 - 我的GlobalData.h文件:

#import <Foundation/Foundation.h>

@interface GlobalData : NSObject {    
    NSMutableArray *listOfHeadings;
    NSMutableArray *listOfItems1;
    NSMutableArray *listOfItems2;
}    
@property(nonatomic,retain)NSMutableArray *listOfHeadings;
@property(nonatomic,retain)NSMutableArray *listOfItems1; 
@property(nonatomic,retain)NSMutableArray *listOfItems2; 
+(GlobalData*)getInstance;  
@end

我的GlobalData.m文件:

#import "GlobalData.h"

@implementation GlobalData
@synthesize listOfHeadings;
@synthesize listOfItems1;
@synthesize listOfItems2;
static GlobalData *instance=nil; 

+(GlobalData *)getInstance    
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    
            instance= [GlobalData new];    
        }    
    }    
    return instance;    
}    
@end

在视图中.m文件(简化):

#import GlobalData.h

GlobalData *globDat=[GlobalData getInstance]; //error occurs here

有人可以指出问题,如果有更好的编码,请赐教 - 谢谢!

修改

以下是我尝试使用的一些链接:

Can i have a single NSMutableArray in my multiple views application?

iPhone help with singleton class

4 个答案:

答案 0 :(得分:8)

在这种情况下,您可能会做的比以往更多。当然,这肯定不是最好的解决方案 - 但您可以将NSMutableArray作为属性放在App Delegate中,然后从任何视图轻松引用它。通过这种方式实现 - 你不是将它锁定为“单例”,而是有一个“单例实例”(这有助于提高测试性)。

我在这里简化了这个过程:

YourAppDelegate.h

@property (nonatomic,retain) NSMutableArray *myArray;

YourAppDelegate.m

@synthesize myArray;

YourViewController.m

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
NSMutableArray *myArrayFromAppDelegate = appDelegate.myArray;

从这一点开始 - 你可以对这个值进行任何操作。

答案 1 :(得分:6)

这是将任何类转换为Singleton的单个方法的“现代”版本(在本例中为格式化为代码片段)。它适用于iOS4.x或更高版本:

+(<#SingletonClassName#> *) sharedInstance 
{
    static <#SingletonClassName#> *_sharedClient = nil;

    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _sharedClient = [[self alloc] init];
    });

    return _sharedClient;
}

但是,你真的需要单个NSMutableArray的单例吗?您可以使用内置的单例 - 您的应用程序委托,通过调用来获取:

MyAppDelegate * appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.myMutableArray addObject:...];

答案 2 :(得分:5)

错误initializer element is not a compile-time constant与您创建单身人士的方式无关。错误是您访问单身人士的方式。你是在一个函数之外做的:

GlobalData *globDat=[GlobalData getInstance];

这意味着您尝试将全局变量(globDat)初始化为表达式[GlobalData getInstance]的值。您只能将全局变量初始化为“编译时常量”的表达式。这意味着0"fred"8/2等内容。 [GlobalData getInstance]的值无法在编译时计算,因此不能用于初始化全局变量。

相反,您只需在函数体内使用[GlobalData getInstance],无论您当前是在尝试使用globDat变量。

至于警告,Incomplete implementation,我看不出有什么遗漏。也许你没有发布GlobalData.h的所有代码。无论如何,您应该能够单击警告(它出现在编辑器窗口右侧)并让Xcode显示缺少的内容。

答案 3 :(得分:3)

这是我创建单身人士的方式:

Singleton.h

#import <Foundation/Foundation.h>

@interface Singleton : NSObject {
    NSMutableArray *firstMutableArray;
    NSMutableArray *secondMutableArray;
}

@property (nonatomic, retain) NSMutableArray *firstMutableArray;
@property (nonatomic, retain) NSMutableArray *secondMutableArray;

+ (id)sharedSingleton;

@end

Sigleton.m

#import "Singleton.h"

static Singleton *sharedMySingleton = nil;

@implementation Singleton

@synthesize firstMutableArray;
@synthesize secondMutableArray;

#pragma mark Singleton Methods

+ (id)sharedSingleton {
    @synchronized(self) {
    if (sharedMySingleton == nil) {
        sharedMySingleton = [[super allocWithZone:NULL] init];
    }
    return sharedMySingleton;
}

+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedSingleton] retain];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)retain {
    return self;
}

- (unsigned)retainCount {
    return UINT_MAX;
}

- (oneway void)release {
    // Never release
}

- (id)autorelease {
    return self;
}

- (id)init {
    if (self = [super init]) {
        firstMutableArray = [[NSMutableArray alloc] initWithObjects:nil];
        secondMutableArray = [[NSMutableArray alloc] initWithObjects:nil];
    }
    return self;
}

- (void)dealloc {
    [firstMutableArray release];
    [secondMutableArray release];
    [super dealloc];
}

@end

然后,当你想打电话给你的单身人士时:

#import "Singleton.h"

Singleton *singleton = [Singleton sharedSingleton];
singleton.firstMutableArray = ...
singleton.secondMutableArray = ...