#iphone #objective-c #ios #xcode
#iPhone #objective-c #iOS #xcode
Вопрос:
В моем приложении Crash Pad Drums сообщалось о сбое. В нем упоминается проблема с определенными звуками тарелок, вызывающими сбой на iPod 4. Одна проблема. Я не могу найти сбой на своем iPod touch 2, и у меня нет iTouch 4.
Что, черт возьми, я могу с этим поделать?
С другой стороны, мое приложение на сегодня бесплатно. Если бы кто-нибудь мог загрузить его и найти обстоятельства сбоя, я был бы у вас в долгу.
РЕДАКТИРОВАТЬ: уточнение
На самом деле я не могу вызвать сбой, поскольку у меня нет более нового устройства для тестирования. Я подозреваю, что это проблема iOS 5, которую я сейчас изучаю, но в будущем, что мне делать, если я дешевка и не хочу покупать новый iTouch?
Редактировать:
Console log:
2011-10-14 23:08:25.797 Crash Pad[794:12203] -[NSConcreteValue doubleValue]: unrecognized selector sent to instance 0xec9e2e0
2011-10-14 23:08:25.798 Crash Pad[794:12203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteValue doubleValue]: unrecognized selector sent to instance 0xec9e2e0'
*** First throw call stack:
(0x1c49052 0x21fdd0a 0x1c4aced 0x1baff00 0x1bafce2 0x16f4f0 0x15d99e 0x14e0d8 0x168d42 0x15ace2 0x5c28c7 0x5c2a31 0x5c2d45 0x1be0f4a 0x1bac665 0x1bac056 0x5c2c43 0x249c8 0x24a58 0x8a72 0x1c4aec9 0x67a299 0x67a306 0x1c4aec9 0x67a299 0x67a306 0x5b6a30 0x5b6c56 0x59d384 0x590aa9 0x28c3fa9 0x1c1d1c5 0x1b82022 0x1b8090a 0x1b7fdb4 0x1b7fccb 0x28c2879 0x28c293e 0x58ea9b 0x1f0d 0x1e85)
terminate called throwing an exceptionCurrent language: auto; currently objective-c
Комментарии:
1. Возможно, переименовать приложение? Извините. Не смог удержаться…
2. Лол. В этом есть смысл, это потенциально опасное имя. И сбой был обнаружен с помощью аварийных тарелок в crash pad … LOL.
3. Кроме того, что плохого в этом вопросе? -1?
Ответ №1:
То, что вы обнаружили, является ошибкой Apple. Вы можете легко воспроизвести, анимировав любое представление, например:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anim.duration = 0.2;
anim.repeatDuration = HUGE_VALF;
anim.autoreverses = YES;
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.0)];
[view.layer addAnimation:anim forKey:@"throb"]; // if this isn't nil we crash on tap
Запустите проект. Коснитесь пульсирующего вида. Сбой. Этот код отлично работал на iOS 3 и iOS 4. На данный момент обходным путем является установка forKey:
значения nil, но это может быть неприемлемо, поскольку этот аргумент может быть важным — ключ, отличный от нуля, означает, что если вы позже добавите другую анимацию с тем же ключом, эта анимация будет удалена, что может быть именно тем, что вы пытались сделать.
Я отправил отчет об ошибке в Apple, и я предлагаю вам сделать то же самое.
РЕДАКТИРОВАТЬ (2/3/12): Хорошо, Apple говорит, что это моя ошибка, а не их. Поскольку я предоставляю преобразование, мне нужно использовать ключ @"transform"
, а не @"transform.scale"
. Более того, z-значение моего преобразования масштаба 3D должно быть 1, а не 0.
Комментарии:
1. @bbum — это будет 10642040. Спасибо за интерес!
2. Это именно та проблема, с которой я столкнулся, автозапуск CATransform и все такое. Рад, что это был не только я, но я бы хотел, чтобы я попытался установить для forKey значение nil, прежде чем менять все это на анимационные блоки.
3. Дал вам проверку, потому что ваш ответ фактически показывает причину сбоя.
4. Классное спасибо. Это чистая случайность, что я наткнулся на ту же ошибку и смог выразить ее так кратко (и чистая случайность, что, перепробовав все, что я мог придумать, я наткнулся на своего рода обходной путь). Я нашел ваш пост, выполнив поиск в сообщении об ошибке,
-[NSConcreteValue doubleValue]: unrecognized selector sent to instance...
, которое просто показывает, всегда показывайте журнал сбоев!5. @мэтт, объяснение Apple относительно ключевого пути было проанализировано для вас? Их ответ, похоже, противоречит документам CA Programming Guide . В моем приложении я хочу применить анимацию только к масштабу, оставив вращение в покое (мое приложение имеет пользовательскую логику для портретного и альбомного режимов). Использование «transform» в качестве ключевого пути приводит к нежелательному эффекту кратковременного поворота, тогда как «transform.scale» работает только с масштабом.
Ответ №2:
Установите NSZombieEnabled, MallocStackLogging и защитите malloc в отладчике. Затем, когда ваше приложение выйдет из строя, введите это в консоли gdb:
(gdb) info malloc-history 0x543216
Замените 0x543216 на адрес объекта, который вызвал сбой, и вы получите гораздо более полезную трассировку стека, и это должно помочь вам точно определить строку в вашем коде, которая вызывает проблему.
Ответ №3:
У вас есть один или два журнала сбоев, которые вы можете опубликовать? Это было бы полезно.
Учитывая, что сбой происходит на более новом оборудовании, а не на более старом, вряд ли это проблема, связанная с памятью. Скорее всего, это проблема времени, связанная с потоковой обработкой; более быстрое устройство выполняет что-то раньше и затрагивает структуру данных, прежде чем с ней будет сделано что-то еще. Учитывая, что воспроизведение звука имеет постоянную продолжительность на разных устройствах, это еще больше подтверждает эту теорию.
Комментарии:
1. Добавлен вывод gdb о сбое
2. @bbum — это ошибка Apple, представленная в iOS 5. Я отправил отчет об ошибке. Смотрите мой ответ на вопрос OP.
Ответ №4:
В итоге это стало проблемой с iOS 5. Я смог сузить причину сбоя, закомментировав различные фрагменты кода. Если сомневаетесь, прокомментируйте.
Комментарии:
1. Не могли бы вы расширить этот ответ? Как вы изменили свой код? У меня такая же проблема в iOS 5.
2. Я думаю, что причина довольно произвольная — некоторые вещи, похоже, конфликтуют в iOS 5, но то, что я сделал, это изменил некоторые элементы CAKeyframeAnimation на блоки анимации.
3. Да, мой сбой также связан с CAAnimation. Но это не приводило к сбою в предыдущих системах. Я обнаружил, что могу обойти это, используя анимационные блоки, но я не хотел этого делать. Как ни странно, решением было использовать нулевой ключ
addAnimation:forKey:
. — Спасибо за подтверждение этого.