使用Singleton类的全局变量NSMuteableArray

时间:2011-04-26 20:22:10

标签: objective-c ios ios4

我无法创建将集合传递给不同视图控制器的好方法。例如,我创建了一个名为Message的自定义类,其中包含许多属性。我希望有一个全局的NSMutableArray存储在一个名为消息的全局变量中,我可以添加到任何地方或从中获取。 Stackoverflow上的每个人都说不要使用你的delagate类来存储全局变量,所以我创建了一个名为Shared的单例类。在那里,我为NSMutableArray创建了一个名为message的属性:


@interface Shared : NSObject {

}

@property (nonatomic, retain) NSMutableArray *messages;

+(Shared *) sharedInstance;

@end

我的.h文件是(重要的部分):


#import "Shared.h"
static Shared* sharedInstance;

@implementation Shared

@synthesize messages;

static Shared *sharedInstance = nil;

-(id) init {
    self = [super init];
    if (self != nil){

    }
    return self;
}

-(void) initializeSharedInstance {

}

+ (Shared *) sharedInstance{
    @synchronized(self) {
        if (sharedInstance == nil){
            sharedInstance = [[self alloc] init];
            [sharedInstance initializeSharedInstance];

        }
        return (sharedInstance);
    }
}

在我的其他视图控制器中,我首先导入“Shared.h”,然后尝试:


[[Shared sharedInstance].messages addObject:m];

NSLog([NSString stringWithFormat:@"Shared messages = %@", [Shared sharedInstance].messages]);

它保持打印null而不是m对象的集合。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

你需要一个静态变量。

在.h:

@interface Shared : NSObject
{
    NSMutableArray *messages;
}

@property (nonatomic, retain) NSMutableArray *messages;

+ (Shared*)sharedInstance;

@end

in .m:

static Shared* sharedInstance;

@implementation Shared

@synthesize messages;


+ (Shared*)sharedInstance
{
    if ( !sharedInstance)
    {
        sharedInstance = [[Shared alloc] init];

    }
    return sharedInstance;
}

- (id)init
{
    self = [super init];
    if ( self )
    {
        messages = [[NSMutableArray alloc] init];
    }
    return self;
}

答案 1 :(得分:1)

一个想法:

@synthesize生成setter和getter方法,它不会初始化你的变量。你在哪里这样做?我在你发布的摘录中看不到它。

答案 2 :(得分:1)

以下内容不是您的问题的答案,而是建议使用(在我看来)使用“更清洁”的替代方法。

使用Singleton存储应用程序范围的替代方法可以是使用类方法定义一个类,该类方法从NSUserDefaults中检索值。可以将此类导入前缀头(* .pch),以便您可以从项目中的每个其他类访问它。

此类中的方法可能如下所示:

Settings.h 中的

// for this example I'll use the prefix for a fictional company called SimpleSoft (SS)
extern NSString *kSSUserLoginNameKey;

+ (NSString *)userLoginName;
+ (void)setUserLoginName:(NSString *)userLoginName; 
Settings.m

内的

kSSUserLoginNameKey = @"SSUserLoginNameKey";

+ (NSString *)userLoginName 
{
    return [[NSUserDefaults standardUserDefaults] valueForKey:kSSUserLoginNameKey];
}

+ (void)setUserLoginName:(NSString *)userLoginName 
{
    [[NSUserDefaults standardUserDefaults] setValue:userLoginName forKey:kSSUserLoginNameKey];
    [[NSUserDefaults standardUserDefaults] synthesize];
}

当然,在像这样的设置中, NSUserDefaults 是通过便利类访问的单例。此类充当 NSUserDefaults 单例的包装器。可以像这样访问值:

NSString userLoginName = [Settings userLoginName];
[Settings setUserLoginName:@"Bob"];

其他类似对象的数组 - 可以以相同的方式访问。要注意的一件事(与当前的方法非常相似)是要注意不要从其他每个类访问这样的类。旨在可重用的组件应该传递值,因此应用程序的组件不会与设置类过于紧密耦合。