UIImage * - это __NSCFArray вместо UIImage - PullRequest
0 голосов
/ 19 сентября 2011

В моем приложении пользователь выбрал фотографию из палитры.Я применяю выбранное изображение к представлению, а затем сохраняю его в файл и ссылаюсь на этот файл в настройках пользователя по умолчанию, чтобы при создании пользовательского профиля загружался аватар.

Когда я закрываю приложение и затем запускаю егоснова приложение загружает изображение из файла.После загрузки изображения из файла мое приложение падает, когда я применяю его к представлению «Изображение», поскольку оно отображается как __NSCFArray.На __NSCFArray нет шкалы методов.Почему он приводится к этому классу?

- [__NSCFArray scale]: нераспознанный селектор отправлен на экземпляр 0x145260

* Завершение работы приложения из-за неисчислимого исключения 'NSInvalidArgumentException ', причина:' [__NSCFArray scale]: нераспознанный селектор отправлен в экземпляр 0x145260 '

Вот мой код, в котором UIImage создается из файла:

@implementation UserProfile 

- (id) init {
    self = [super init];
    if(self) {      
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    _username = (NSString *)[userDefaults objectForKey:USERNAME_KEY];
    NSString *filename = (NSString *) [userDefaults objectForKey:@"AvatarFilename"];
    NSLog(@"filename from user defaults: %@",filename);
    if (filename) {
            _avatar = [UIImage imageWithContentsOfFile:filename];
            if (!_avatar) NSLog(@"LOGERROR: avatar was not created from file");
                _customAvatar = TRUE;
            } else {
                _customAvatar = FALSE;
                _avatar = [UIImage imageNamed:DEFAULT_AVATAR_FILENAME];
                if (!_avatar) NSLog(@"LOGERROR: avatar was not created from default");
            }
        [self createThumbnail];        
    }
    return self;
}

Примечание: в моем коде createThumbnail я называю это [_avatar isKindOfClass: [UIImage class], и он говорит, что это UIImage.Но потом, когда я устанавливаю представление, он думает, что это __NSCFArray.Я даже не понимаю, как это возможно, так как свойство является UIImage *.

Вот как изображение сохраняется

- (void) setAvatar:(UIImage *)image
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *filename = nil;

    if (image) {
        if (_avatar) [_avatar release];
        _avatar = [image retain];
        _customAvatar = TRUE;
    filename = [NSString stringWithFormat:@"%@/%@",[MyUtilities applicationDocumentsDirectory],AVATAR_FILENAME];
        if (![UIImagePNGRepresentation(image) writeToFile:filename atomically:YES])
            NSLog(@"LOGERROR: Failure to write avatar file");
        else NSLog(@"saved avatar to PNG file");
    } else {
        NSLog(@"setting default avatar");
        _avatar = [UIImage imageNamed:DEFAULT_AVATAR_FILENAME]; 
        _customAvatar = FALSE;
    }

    [userDefaults setObject:filename forKey:AVATAR_KEY];
    // TODO If performance is crucial, consider creating a default thumbnail as well
    [self createThumbnail];

    if(![userDefaults synchronize])
    { 
        NSLog(@"LOGERROR: Failure to synchronize userDefaults");
    }

}

Насколько я знаю, я не получаю предупреждение памяти,

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Вы присваиваете автоматически выпущенные объекты своим иварам.Скорее всего, они освобождаются, и затем, когда вы пытаетесь получить доступ к одному из этих UIImage, это оказывается NSArray с тем же адресом памяти.

_username = (NSString *)[userDefaults objectForKey:USERNAME_KEY];
...
_avatar = [UIImage imageWithContentsOfFile:filename];
...
_avatar = [UIImage imageNamed:DEFAULT_AVATAR_FILENAME];

Вам необходимо сохранить их.

1 голос
/ 19 сентября 2011

Вы сохраняете autoreleased объект (возврат по imageNamed: и imageWithContentsOfFile:) без retaining in init.Вы можете заменить этот метод следующим:

- (id) init {
    self = [super init];
    if(self) {      
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        _username = (NSString *)[userDefaults objectForKey:USERNAME_KEY];
        NSString *filename = (NSString *) [userDefaults objectForKey:@"AvatarFilename"];
        NSLog(@"filename from user defaults: %@",filename);
        if (filename) {
            _avatar = [[UIImage imageWithContentsOfFile:filename] retain];
            if (!_avatar) NSLog(@"LOGERROR: avatar was not created from file");
            _customAvatar = TRUE;
        } else {
            _customAvatar = FALSE;
            _avatar = [[UIImage imageNamed:DEFAULT_AVATAR_FILENAME] retain];
            if (!_avatar) NSLog(@"LOGERROR: avatar was not created from default");
        }
        [self createThumbnail];        
    }
    return self;
}

Вам больше не нужно retain этот объект.Просто release это в dealloc.

В setAvatar: вы также должны retain вернуть значение imageNamed:: _avatar = [[UIImage imageNamed:DEFAULT_AVATAR_FILENAME] retain];

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