2012-01-26 3 views
0

Я хочу, чтобы хранить массив UIImage и я делаю это:IOS: NSUserDefault для массива UIImage

//in didFinishLaunchingWithOption 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:@"theKey"]; 
if (data == NULL) arrayImage = [[NSMutableArray alloc] init]; 
else {arrayImage = [[NSMutableArray alloc] init]; arrayImage = [NSKeyedUnarchiver unarchiveObjectWithData:data];} 
NSLog(@"arrayImage:%@", arrayImage); 

//and in applicationDidEnterBackground 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arrayImage]; 
[defaults setObject:data forKey:@"theKey"]; 
NSLog(@"arrayImage:%@", arrayImage); 

когда приложение работать в didFinishLaunchingWithOption в NSLog я вижу все объекты в моем массиве, но когда я использую это, у меня есть сбой, который говорит: «[__NSArrayM count]: сообщение отправлено на освобожденный экземпляр« почему?

ответ

1

Я не совсем уверен, но я думаю, что

+ (идентификатор) unarchiveObjectWithData: данные (NSData *)

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

Я бы переписать какую-то часть вашего кода:

... 
if (data == nil) 
{ 
    arrayImage = [[NSMutableArray alloc] init]; 
} else 
{ 
    //arrayImage = [[NSMutableArray alloc] init]; //why to allocate and initialize if you are goind to unarchive it? 
    //arrayImage = [[NSKeyedUnarchiver unarchiveObjectWithData:data] retain]; //note the retain here 
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data]; //the unarchive won't mantain mutability (I guess). 
    arrayImage = [NSMutableArray arrayWithArray:arr]; //create a mutable copy 
} 
... 
+0

Я забыл сохранить сообщение до моего последнего подхода! Вы должны заменить последнюю команду любым из них: arrayImage = [[NSMutableArray arrayWithArray: arr] сохранить]; или arrayImage = [arr mutableCopy]; –

+0

отлично !!!!!!!!!! – CrazyDev

1

Я предполагаю, что вы не используете ARC. Проблема в:

if (data == NULL) 
    arrayImage = [[NSMutableArray alloc] init]; 
else { 
    arrayImage = [[NSMutableArray alloc] init]; 
    // HERE 
    arrayImage = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

В HERE, вы замените значение в arrayImage с новым экземпляром для шпоночным Unarchiver. Значение, которое вы init 'd только что было потеряно (фактически, просочилось). Значение от unarchiver - это автореализованный объект, поэтому он будет выпущен, когда пул будет удален. Это происходит до вызова applicationDidEnterBackground.

Правильное решение - сохранить значение от unarchiver. Viz:

if (data == nil) 
    arrayImage = [[NSMutableArray alloc] init]; 
else 
    arrayImage = [[NSKeyedUnarchiver unarchiveObjectWithData:data] retain]; 
+0

Это правильное решение. –

+0

Это то же самое, у меня такая же проблема с или без "arrayImage = [[NSMutableArray alloc] init];" – CrazyDev