使用Singleton类的全局variablesNSMuteableArray
我无法创build一个传递集合到不同视图控制器的好方法。 例如,我创build了一个名为Message的自定义类,其中包含一些属性。 我想要一个全局的NSMutableArray中的那些存储在一个叫做消息的全局variables中,我可以在任何地方添加或者获取。 Stackoverflow上的每个人都说不要使用delagate类来存储全局variables,所以我创build了一个名为Shared的单例类。 在那里,我为NSMutableArray创build了一个属性,如下所示:
@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个对象。 有什么想法吗?
你需要有一个静态variables。
在.h中:
@interface Shared : NSObject { NSMutableArray *messages; } @property (nonatomic, retain) NSMutableArray *messages; + (Shared*)sharedInstance; @end
在.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; }
一个想法:
@synthesize生成setter和getter方法,它不会初始化你的variables。 你在哪里做的? 我无法在您发布的摘录中看到它。
以下不是对您的问题的回答,而是对另一种方法(在我看来)是“更清洁”的使用方法的build议。
使用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"];
其他类似数组的对象也可以以相同的方式访问。 有一点需要注意(与现在的方法大致相同),注意不要让其他class级的class级像这样进入class级。 旨在可重用的组件应该传递值,所以应用程序的组件不会变得太紧密地耦合到设置类。