Массив не сохраняется вне viewDidLoad - PullRequest
0 голосов
/ 06 июля 2010

У меня странная проблема с NSUsrDefaults.Всякий раз, когда я получаю данные из NSUserDefaults, они временно заполняются.Я извлекаю его в viewDidLoad, где он извлекается.

-(void)viewDidLoad{
companies = [NSMutableArray array];
oldCompanies = [[NSUserDefaults standardUserDefaults] arrayForKey:@"companyData"];
if( companies )
{
    for( NSData *data in oldCompanies )
    {
        companyObj = (Company*) [NSKeyedUnarchiver unarchiveObjectWithData:data];
        [companies addObject:companyObj];
    }
}
}

Но вне viewDidLoad всякий раз, когда я пытаюсь получить доступ к данным, массиву "oldCompanies", а также "companies" показывается "nil".

EDIT: я кодируюобъект моей компании в классе, который является подклассами NSCoding, как показано ниже, но нигде не выделяет и не сохраняет свойства.Может ли это быть подвохом?

- (void)encodeWithCoder:(NSCoder *)encoder
{
//Encode properties, other class variables, etc
[encoder encodeObject:self.companyId forKey:@"id"];
[encoder encodeObject:self.companyTitle forKey:@"title"];
[encoder encodeObject:self.companyImage forKey:@"image"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if( self != nil )
{
    //decode properties, other class vars
    self.companyId = [decoder decodeObjectForKey:@"id"];
    self.companyTitle = [decoder decodeObjectForKey:@"title"];
    self.companyImage = [decoder decodeObjectForKey:@"image"];
}
return self;
 }

Кто-нибудь может помочь, пожалуйста?

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 06 июля 2010

Вы не сохраняете массив, когда вы не выполняете выделение или сохраняете при создании объекта, вы получаете объект с автоматическим освобождением, в ваших примерах компании автоматически освобождаются, и поэтому вы не можете получить к нему доступ позже, вам следует либо распределите [[NSMutableArray alloc] init] или сохраните его [NSMutableArray array] retain] ... в любом случае обратитесь к руководству по управлению памятью, чтобы узнать об управлении памятью target-c управление памятью ref

1 голос
/ 06 июля 2010

+array создает автоматически выпущенный массив - если вы хотите стать владельцем этого объекта в соответствии с правилами управления памятью , вам необходимо сохранить его:

[companies retain];

или создатьчто он не выпущен автоматически:

companies = [[NSMutableArray alloc] init];

Или, лучше, пусть объявленные свойства сделают это за вас:

// interface, property declaration:
@property(retain, readwrite) NSMutableArray *companies;

// implementation:
@synthesize companies;

// ... using it:
self.companies = [NSMutableArray array];
0 голосов
/ 06 июля 2010

Вы пытаетесь получить доступ к данным до загрузки представления?

Objective-C не сбрасывает ваши указатели за вас.Если массив не «сохраняется», указатель будет указывать на мусор.

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