使用singleton创建可由多个视图访问的数组



这是一个经典的问题。

我想从应用程序中的任何位置访问一组对象。我还想使用singleton来实现这一点。我的问题是:

  1. 我在哪里实例化我的singleton对象
  2. 在哪里实例化NSMutable对象数组
  3. 如何从项目中的任何位置引用此数组

非常感谢所有代码和示例!

编辑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);
  1. 您使用惰性实例化,也就是说,一个返回您的singleton对象的类方法。第一次调用此方法时,它会创建实例,此后的所有其他时间,它只返回已经可用的实例(保留在类变量中)。

  2. 我以为你的单身汉的目的是持有这个数组?您可以在singleton的初始值设定项中创建它,也可以在第一次需要时惰性地创建它。

  3. AppName-pefix.pch文件中,您#导入其类。此全局导入将在整个应用程序中可用。

最新更新