我已经回顾过(和尝试过)一些关于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?
答案 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 = ...