Сбой UIImageView при попытке установить фрейм - PullRequest
4 голосов
/ 14 марта 2011

Сначала вот мой журнал аварий:

Тема 0 Сбой:
0 libSystem.B.dylib 0x35176264 __kill + 8
1 libSystem.B.dylib 0x35176254 kill + 4
2 libSystem.B.dylib 0x35176246 повышение + 10
3 libSystem.B.dylib 0x3518ad02 прерывание + 50
4 libstdc ++. 6.dylib 0x31432a20 __gnu_cxx :: __ verbose_terminate_handler () + 376
5 libobj. 5 libobj.dylib 0x31a97594 _objc_terminate + 104
6 libstdc ++. 6.dylib 0x31430df2 _ cxxabiv1 :: _terminate (void (*) ()) + 46
7 libstdc ++. 6.dylib 0x31430e46 st :: terminate() + 10
8 libstdc ++. 6.dylib 0x31430f16 __cxa_throw + 78
9 libobjc.A.dylib 0x31a964c4 objc_exception_throw + 64
10 CoreFoundation 0x361857c2 + [повышение NSException]: 62: аргументы в формате NSException: формат: аргументы: format:* 11 CoreFoundation 0x361857fc + [повышение NSException: формат:] + 28
12 QuartzCore 0x3148b222 CALayerSetPosition (CALayer *, CA :: Vec2 const &, bool) + 134
13 QuartzCore 0x3148b190 - [CALayer setPosition:1020 * 14 QuartzCore 0x3148b0dc - [CALayersetFrame:] + 384
15 UIKit 0x35d15aba - [UIView (геометрия) setFrame:] + 182
16 UIKit 0x35d15928 - [UIImageView setFrame:] + 96

Я скопировал частьиз журнала сбоя.После строки 16 есть мои классы, которые я не могу представить здесь.В MyClass и MyMethod я изменяю фрейм imageView.Моя проблема в том, что я не могу воспроизвести эту ошибку, и я хочу воспроизвести ее.Что вызывает этот журнал?Я пытался освободить imageView, прежде чем вызвать setFrame :, но это не выдает эту ошибку.Есть идеи как его получить?Или почему эта ошибка случается несколько раз?

1 Ответ

8 голосов
/ 14 марта 2011

Я узнаю эту проблему по одному из моих собственных проектов.Обычно, когда setFrame: падает, это потому, что вы пытаетесь установить NaN (не число).Я не знаю, имели ли вы дело с NaN раньше, но если вы еще не оставили комментарий, и я предоставлю информацию о том, как с ним работать.

РЕДАКТИРОВАТЬ: Я подумал, что могу привести пример.

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

Рассмотрим следующий код:

- (void)layoutSubviews {
    CGRect imageFrame;
    switch (self.state) {
        case 0:
            imageFrame = CGRectMake(0, 0, 100, 100);
        case 1:
            imageFrame = CGRectMake(10, 10, 50, 50);
    }
    self.imageView.frame = imageFrame;
}

Учтите, что self.state равно 2, тогда imageFrame никогда не будет инициализирован и будет содержать все, что было в этой ячейке памяти, возможно, NaN.Причина, по которой это трудно воспроизвести, состоит в том, что сбой происходит только тогда, когда в этой ячейке памяти есть NaN.

В моем примере ошибку очень легко обнаружить, и, вероятно, ее не так легко обнаружитьв вашем коде.Если вы не можете найти его самостоятельно, не стесняйтесь опубликовать свой код, и я посмотрю на него.Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии.

...