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

时间:2011-06-12 21:15:31

标签: iphone objective-c xcode cocoa-touch singleton

这是一个经典问题。

我想从我的应用程序中的任何位置访问一组对象。我也想用单身人士做这件事。我的问题是:

  1. 我在哪里实例化我的单件对象?
  2. 我在哪里实例化我的NSMutable对象数组?
  3. 如何在项目中的任何位置引用此数组?
  4. 非常感谢所有代码和示例!

    编辑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];
    }
    

2 个答案:

答案 0 :(得分:9)

你的单身人士是这样的:

@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);

答案 1 :(得分:2)

  1. 您使用延迟实例化,即返回单个对象的类方法。第一次调用此方法时,它会创建实例,此后所有其他时间,它只返回已经可用的实例(保留在类变量中)。

  2. 我认为你的单身人士的意思是拿着这个阵列?您可以在单例的初始化程序中创建它,也可以在第一次需要时懒惰地创建它。

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