首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Xcode4创建/使用单例NSMutableArray的正确方法

为Xcode4创建/使用单例NSMutableArray的正确方法
EN

Stack Overflow用户
提问于 2012-01-20 03:02:32
回答 4查看 14K关注 0票数 5

我已经回顾(并尝试)了这里关于单例和NSMutableArrays的一堆帖子。我是Objective-C的新手,所以请耐心听我说。

我只想创建一些可以从任何view/.m文件访问的数组。

单例最好(或最简洁)的编码是什么?

下面是我现在得到的结果,我在.m '@implementation‘-“implementation”不完整“1在视图.m文件中使用时出现错误- "initializer element is not a compile-time constant”

这是我现在拥有的代码-我的GlobalData.h文件:

代码语言:javascript
运行
复制
#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文件:

代码语言:javascript
运行
复制
#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文件(简化)中:

代码语言:javascript
运行
复制
#import GlobalData.h

GlobalData *globDat=[GlobalData getInstance]; //error occurs here

有没有人能指出问题所在,如果有更好的编码,请告诉我--谢谢!

编辑

以下是我尝试使用的几个链接:

Can i have a single NSMutableArray in my multiple views application?

iPhone help with singleton class

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-20 03:12:36

在这种情况下,您可能做了比必须做的更多的事情。诚然,这当然不是最好的解决方案--但你可以把你的NSMutableArray作为一个属性放在你的App Delegate中,然后很容易从任何视图中引用它。通过这样做-你不会把它锁定为一个“单例”,但它有一个“单例实例”(这对可测试性有很大的帮助)。

我在这里简化了这个过程:

YourAppDelegate.h

代码语言:javascript
运行
复制
@property (nonatomic,retain) NSMutableArray *myArray;

YourAppDelegate.m

代码语言:javascript
运行
复制
@synthesize myArray;

YourViewController.m

代码语言:javascript
运行
复制
YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
NSMutableArray *myArrayFromAppDelegate = appDelegate.myArray;

从这一点-你可以对这个值做任何操作。

票数 8
EN

Stack Overflow用户

发布于 2012-01-20 03:10:59

下面是将任何类转换为Singleton的单个方法的“现代”版本(在本例中格式化为代码片段)。它可以在iOS4.x或更高版本中运行:

代码语言:javascript
运行
复制
+(<#SingletonClassName#> *) sharedInstance 
{
    static <#SingletonClassName#> *_sharedClient = nil;

    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _sharedClient = [[self alloc] init];
    });

    return _sharedClient;
}

但是,您真的需要单个NSMutableArray的单个实例吗?您可以使用内置的单例-您的应用程序委托,它是通过调用以下命令获得的:

代码语言:javascript
运行
复制
MyAppDelegate * appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.myMutableArray addObject:...];
票数 6
EN

Stack Overflow用户

发布于 2012-01-20 03:26:47

错误initializer element is not a compile-time constant与您如何创建单例无关。错误是你访问你的单例的方式。您可以在函数外部执行此操作:

代码语言:javascript
运行
复制
GlobalData *globDat=[GlobalData getInstance];

这意味着您正尝试将全局变量(globDat)初始化为表达式[GlobalData getInstance]的值。只能将全局变量初始化为“编译时常量”的表达式。这意味着像0"fred"8/2这样的东西。[GlobalData getInstance]的值不能在编译时计算,因此不能用于初始化全局变量。

相反,只要在当前尝试使用globDat变量的地方,就可以在函数体中使用[GlobalData getInstance]

至于警告,Incomplete implementation,我看不出遗漏了什么。也许您并没有发布来自GlobalData.h的所有代码。无论如何,您应该能够单击警告(它出现在编辑器窗口的右侧),并让Xcode向您显示缺少的内容。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8931742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档