问题描述
|
这是一个经典的问题。
我想从我的应用程序中的任何位置访问对象数组。我也想使用单例。我的问题是:
我在哪里实例化我的单例对象?
我在哪里实例化我的NSMutable对象数组?
如何在项目中的任何地方引用此数组?
非常感谢所有代码和示例!
编辑1
这是我到目前为止所拥有的。我无法弄清楚如何正确,一致地访问此香蕉阵列:
#import <Foundation/Foundation.h>
@interface Singleton : NSObject {
NSMutableArray *bananas;
}
@property (nonatomic,retain) NSMutableArray *bananas;
@end
#import \"Singleton.h\"
static Singleton *mySingleton;
@implementation Singleton
@synthesize bananas;
#pragma mark SingletonDescption stuff
+ (Singleton *)mySingleton
{
if(!mySingleton){
mySingleton = [[Singleton alloc]init];
}
return mySingleton;
}
+ (id)allocWithZone:(NSZone *)zone
{
if (!mySingleton) {
mySingleton = [super allocWithZone:zone];
return mySingleton;
} else {
return nil;
}
}
- (id)copyWithZone:(NSZone*) zone
{
return self;
}
- (void)release
{
// NO OP
}
@end
编辑2
这就是我试图使用我的单例对象在表单元格中放置对象数组的方式。什么也没发生,表格单元格空白:(
- (id)init
{
[super initWithStyle:UITableViewStylePlain];
// bananas = [[NSMutableArray alloc] init];
Singleton *mySingleton = [[Singleton alloc]init];
mySingleton.bananas = [[NSMutableArray alloc]init];
UIImage *imageA = [UIImage imageNamed:@\"A.png\"];
UIImage *imageB = [UIImage imageNamed:@\"B.png\"];
UIImage *imageC = [UIImage imageNamed:@\"C.png\"];
Banana *yellowBanana = [[Banana alloc] initWithName:@\"Yellow\" description:@\"Beautiful\" weight:22.0 icon:imageA];
Banana *greenBanana = [[Banana alloc] initWithName:@\"Green\" description:@\"Gorgeous\" weight:12.0 icon:imageB];
Banana *rottenBanana = [[Banana alloc] initWithName:@\"Rotten\" description:@\"Ugly\" weight:8.0 icon:imageC];
[mySingleton.bananas addobject:yellowBanana];
[mySingleton.bananas addobject:greenBanana];
[mySingleton.bananas addobject:rottenBanana];
}
解决方法
像这样单身吗:
@interface Singleton : NSObject
@property (nonatomic,retain) NSMutableArray *bananas;
+(Singleton*)singleton;
@end
@implementation Singleton
@synthesize bananas;
+(Singleton *)singleton {
static dispatch_once_t pred;
static Singleton *shared = nil;
dispatch_once(&pred,^{
shared = [[Singleton alloc] init];
shared.bananas = [[NSMutableArray alloc]init];
});
return shared;
}
@end
首次使用时,单例已初始化。您可以随时随地调用它:
NSLog(@\"%@\",[Singleton singleton].bananas);
,
您使用惰性实例化,即返回您的单例对象的类方法。第一次调用此方法时,它将创建实例,此后所有其他时间,它将仅返回已可用的实例(保留在类变量中)。
我以为您单身人士的要点是持有这个阵列?您可以在单例的初始化程序中创建它,也可以在第一次需要它时懒惰地创建它。
在您的AppName-pefix.pch文件中,#import其类。此全局导入将在整个应用程序中可用。