我无法创建将集合传递给不同视图控制器的好方法。例如,我创建了一个名为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对象的集合。有什么想法吗?
答案 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 : 内的
当然,在像这样的设置中, NSUserDefaults 是通过便利类访问的单例。此类充当 NSUserDefaults 单例的包装器。可以像这样访问值: 其他类似对象的数组 - 可以以相同的方式访问。要注意的一件事(与当前的方法非常相似)是要注意不要从其他每个类访问这样的类。旨在可重用的组件应该传递值,因此应用程序的组件不会与设置类过于紧密耦合。kSSUserLoginNameKey = @"SSUserLoginNameKey";
+ (NSString *)userLoginName
{
return [[NSUserDefaults standardUserDefaults] valueForKey:kSSUserLoginNameKey];
}
+ (void)setUserLoginName:(NSString *)userLoginName
{
[[NSUserDefaults standardUserDefaults] setValue:userLoginName forKey:kSSUserLoginNameKey];
[[NSUserDefaults standardUserDefaults] synthesize];
}
NSString userLoginName = [Settings userLoginName];
[Settings setUserLoginName:@"Bob"];