Сохранение картинок в приложениях для iPhone - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть приложение с массивом объектов, которые я заархивировал и разархивировал

-(id)initWithCoder:(NSCoder *)aDecoder{
    title = [aDecoder decodeObjectForKey:@"Title"];
    image = [aDecoder decodeObjectForKey:@"Image"];
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:title forKey:@"Title"];
    [aCoder encodeObject:image forKey:@"Image"];
}

будет UIImage хорошо храниться таким образом?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Нет, UIImage не соответствует протоколу NSCoding.

Чтобы сохранить изображение, преобразуйте его в NSData, используя UIImageJPEGRepresentation(image, quality) или UIImagePNGRepresentation(image), а затем вы можете сохранить объект NSData в своем кодере, потому чтоон соответствует NSCoding.

Примерно так:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if ((self = [super init])){
        title = [aDecoder decodeObjectForKey:@"Title"];
        image = [UIImage imageWithData:[aDecoder decodeObjectForKey:@"ImageData"]];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:title forKey:@"Title"];
    [aCoder encodeObject:UIImagePNGRepresentation(image) forKey:@"ImageData"];
}

PS, я полагаю, вы используете ARC?Если это не так, вам нужно сохранить значения в вашем методе initWithCoder, потому что decodeObjectForKey: возвращает объект с автоматическим освобождением.Я также переписал ваш initWithCoder, чтобы включить обычную проверку super / nil, что является лучшей практикой.

Обратите внимание, что вы можете использовать self = [self init] или self = [super initWithCoder:aDecoder] вместо self = [super init], в зависимости от того, чтоВаш суперкласс и есть ли у вашего init какие-либо дополнительные настройки.

0 голосов
/ 11 февраля 2012

Кодер и декодер, которые были реализованы в вопросе в порядке

...