Использование синглтона для создания массива, доступного для нескольких представлений - PullRequest
1 голос
/ 13 июня 2011

Это классическая проблема.

Я хотел бы получить доступ к массиву объектов из любого места в моем приложении.Я также хотел бы сделать это с помощью синглтона.Мои вопросы:

  1. Где создать экземпляр моего одноэлементного объекта?
  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

Вот как я пытаюсь использоватьмой одноэлементный объект, чтобы иметь массив объектов, помещенных в ячейку таблицы.Ничего не происходит, и ячейка таблицы становится пустой: (* ​​1026 *

- (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 ]

9 голосов
/ 13 июня 2011

Сделайте ваш синглтон следующим образом:

@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);
2 голосов
/ 13 июня 2011
  1. Вы используете ленивый экземпляр, то есть метод класса, который возвращает ваш одноэлементный объект.При первом вызове этого метода он создает экземпляр, а в остальное время просто возвращает уже доступный экземпляр (сохраняется в переменной класса).

  2. Я думал, что смыслваш синглтон должен был держать этот массив?Вы можете создать его в инициализаторе синглтона или создать его лениво, когда он понадобится в первый раз.

  3. В файле AppName -pefix.pch вы можете# импортировать свой класс.Этот глобальный импорт будет доступен во всем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...