这是一个经典的问题。
我想从应用程序中的任何位置访问一组对象。我还想使用singleton来实现这一点。我的问题是:
- 我在哪里实例化我的singleton对象
- 在哪里实例化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
这就是我尝试使用我的singleton对象在表单元格中放置对象数组的方式。什么也没发生,表格单元格出现空白:(
- (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
singleton是在您第一次使用它时初始化的。您可以在任何时间从任何地方调用它:
NSLog(@"%@",[Singleton singleton].bananas);
-
您使用惰性实例化,也就是说,一个返回您的singleton对象的类方法。第一次调用此方法时,它会创建实例,此后的所有其他时间,它只返回已经可用的实例(保留在类变量中)。
-
我以为你的单身汉的目的是持有这个数组?您可以在singleton的初始值设定项中创建它,也可以在第一次需要时惰性地创建它。
-
在AppName-pefix.pch文件中,您#导入其类。此全局导入将在整个应用程序中可用。