我已经回顾(并尝试)了这里关于单例和NSMutableArrays的一堆帖子。我是Objective-C的新手,所以请耐心听我说。
我只想创建一些可以从任何view/.m文件访问的数组。
单例最好(或最简洁)的编码是什么?
下面是我现在得到的结果,我在.m '@implementation‘-“implementation”不完整“1在视图.m文件中使用时出现错误- "initializer element is not a compile-time constant”
这是我现在拥有的代码-我的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?
发布于 2012-01-20 03:12:36
在这种情况下,您可能做了比必须做的更多的事情。诚然,这当然不是最好的解决方案--但你可以把你的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;从这一点-你可以对这个值做任何操作。
发布于 2012-01-20 03:10:59
下面是将任何类转换为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:...];发布于 2012-01-20 03:26:47
错误initializer element is not a compile-time constant与您如何创建单例无关。错误是你访问你的单例的方式。您可以在函数外部执行此操作:
GlobalData *globDat=[GlobalData getInstance];这意味着您正尝试将全局变量(globDat)初始化为表达式[GlobalData getInstance]的值。只能将全局变量初始化为“编译时常量”的表达式。这意味着像0、"fred"或8/2这样的东西。[GlobalData getInstance]的值不能在编译时计算,因此不能用于初始化全局变量。
相反,只要在当前尝试使用globDat变量的地方,就可以在函数体中使用[GlobalData getInstance]。
至于警告,Incomplete implementation,我看不出遗漏了什么。也许您并没有发布来自GlobalData.h的所有代码。无论如何,您应该能够单击警告(它出现在编辑器窗口的右侧),并让Xcode向您显示缺少的内容。
https://stackoverflow.com/questions/8931742
复制相似问题