【发布时间】:2011-04-26 20:22:10
【问题描述】:
我在创建一种将集合传递给不同视图控制器的好方法时遇到了麻烦。例如,我创建了一个名为 Message 的自定义类,其中包含一堆属性。我想要一个全局的 NSMutableArray 存储在一个名为消息的全局变量中,我可以添加到任何地方或从任何地方获取。 Stackoverflow 上的每个人都说不要使用你的 delagate 类来存储全局变量,所以我创建了一个名为 Shared 的单例类。在那里,我为 NSMutableArray 创建了一个名为 messages 的属性,如下所示:
@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 个对象的集合。有什么想法吗?
【问题讨论】:
-
你在哪里初始化消息?我认为@synthesize 不会初始化变量。
-
也许人们因为不推荐全局变量而说不要使用app delegate来存储全局变量?用户默认设置或在创建视图控制器时传递数据也可以。
-
Matt,我刚刚添加了 init,以便您可以看到该部分。特里,好点子。如果我不能以这种方式解决问题,我可能最终会走那条路。出于理智考虑,如果可能的话,我想解决这个问题。
-
马特,我想我误解了你的问题。我展示了我的 init 函数,但我可能必须从我第一次使用它的其他类中实际调用 init。
标签: objective-c ios ios4