Глобальная переменная NSMuteableArray с использованием класса Singleton - PullRequest
2 голосов
/ 27 апреля 2011

У меня проблемы с созданием хорошего способа передачи коллекции различным контроллерам представления. Например, я создал собственный класс под названием Message с набором атрибутов. Я хочу иметь глобальный NSMutableArray из тех, которые хранятся в глобальной переменной, называемой сообщениями, которые я могу добавлять или получать из любого места. Все в Stackoverflow говорят, что не следует использовать ваш класс delagate для хранения глобальных переменных, поэтому я создал одноэлементный класс с именем Shared. Там я создал свойство для NSMutableArray, называемое сообщениями вроде этого:


@interface Shared : NSObject {

}

@property (nonatomic, retain) NSMutableArray *messages;

+(Shared *) sharedInstance;

@end

И мой файл .h (важная часть):


#import "Shared.h"
static Shared* sharedInstance;

@implementation Shared

@synthesize messages;

static Shared *sharedInstance = nil;

-(id) init {
    self = [super init];
    if (self != nil){

    }
    return self;
}

-(void) initializeSharedInstance {

}

+ (Shared *) sharedInstance{
    @synchronized(self) {
        if (sharedInstance == nil){
            sharedInstance = [[self alloc] init];
            [sharedInstance initializeSharedInstance];

        }
        return (sharedInstance);
    }
}

В моем другом контроллере представления я сначала импортирую «Shared.h», а затем попробуйте это:


[[Shared sharedInstance].messages addObject:m];

NSLog([NSString stringWithFormat:@"Shared messages = %@", [Shared sharedInstance].messages]);

Он продолжает печатать ноль вместо коллекции m объектов. Есть мысли?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

Вам нужна статическая переменная.

В .h:

@interface Shared : NSObject
{
    NSMutableArray *messages;
}

@property (nonatomic, retain) NSMutableArray *messages;

+ (Shared*)sharedInstance;

@end

в .m:

static Shared* sharedInstance;

@implementation Shared

@synthesize messages;


+ (Shared*)sharedInstance
{
    if ( !sharedInstance)
    {
        sharedInstance = [[Shared alloc] init];

    }
    return sharedInstance;
}

- (id)init
{
    self = [super init];
    if ( self )
    {
        messages = [[NSMutableArray alloc] init];
    }
    return self;
}
1 голос
/ 27 апреля 2011

Это не ответ на ваш вопрос, а предложение альтернативного подхода, который (на мой взгляд) «чище» в использовании.

Альтернатива использованиюСинглтоном для хранения всего приложения может быть определение класса с помощью методов класса, которые извлекают значения из NSUserDefaults.Этот класс может быть импортирован в заголовок префикса (* .pch), так что вы можете получить к нему доступ из любого другого класса в проекте.

Методы внутри этого класса могут выглядеть следующим образом:

внутри Settings.h :

// for this example I'll use the prefix for a fictional company called SimpleSoft (SS)
extern NSString *kSSUserLoginNameKey;

+ (NSString *)userLoginName;
+ (void)setUserLoginName:(NSString *)userLoginName; 

внутри Settings.m :

kSSUserLoginNameKey = @"SSUserLoginNameKey";

+ (NSString *)userLoginName 
{
    return [[NSUserDefaults standardUserDefaults] valueForKey:kSSUserLoginNameKey];
}

+ (void)setUserLoginName:(NSString *)userLoginName 
{
    [[NSUserDefaults standardUserDefaults] setValue:userLoginName forKey:kSSUserLoginNameKey];
    [[NSUserDefaults standardUserDefaults] synthesize];
}

Конечно, в такой конфигурации NSUserDefaults - это единственный объект, доступ к которому осуществляется через удобный класс.Этот класс действует как оболочка для синглтона NSUserDefaults .Доступ к значениям можно получить следующим образом:

NSString userLoginName = [Settings userLoginName];
[Settings setUserLoginName:@"Bob"];

К другим объектам, таким как массивы, можно получить доступ почти таким же образом.Одна вещь, с которой нужно быть осторожным (почти так же, как с вашим текущим подходом), это быть осторожным, чтобы не получить доступ к классу, подобному этому, из любого другого класса.Компоненты, предназначенные для повторного использования, должны передавать значения, поэтому компоненты приложения не будут слишком тесно связаны с классом настроек.

1 голос
/ 27 апреля 2011

Мысль:

@ synthesize генерирует методы сеттера и геттера, она не инициализирует вашу переменную.Где ты это делаешь?Я не вижу его в отрывках, которые вы разместили.

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