数组不会在viewDidLoad之外保留

时间:2010-07-06 14:26:30

标签: iphone nsuserdefaults

我正面临一个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”以及“公司”都显示为“nil”。

编辑: 我将我的Company对象编码在一个类中,该类是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 个答案:

答案 0 :(得分:1)

+array会创建一个自动释放的数组 - 如果您想根据memory management rules获取所有权,那么您需要保留它:

[companies retain];

或者创建它以便它不会自动释放:

companies = [[NSMutableArray alloc] init];

或者,更好的是,让declared properties为您做到这一点:

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

// implementation:
@synthesize companies;

// ... using it:
self.companies = [NSMutableArray array];

答案 1 :(得分:1)

你没有保留数组,当你没有做一个alloc,或者在设置一个对象时保留你得到一个自动释放的对象,在你的示例公司是自动释放的,这就是为什么你以后不能再访问它了要么分配它 [[NSMutableArray alloc] init]或保留它[NSMutableArray array] retain] ...无论哪种方式引用内存管理指南来了解objective-c内存管理memory managment ref

答案 2 :(得分:0)

您是否在加载视图之前尝试访问数据?

Objective-C不会为您重置指针。如果数组不是“持久化”,那么指针将指向垃圾。