2013-11-08 4 views
0

У меня есть приложение, которое я продаю на рынке Mac, и это приложение работает без задержек - пока клиенты не запускали его под Mavericks.Категория метод не всегда называется, когда приложение работает под Mavericks

Что это сводится к тому, есть исключения, как это, что я получаю назад от клиентов:

11/7/13 8: 54: 17,841 AM MyApp [65256]: - [Вт собственности на квадратный MeterStringValue]: непризнанные селектор направлен например 0x7fa66c80a760

Теперь, очевидно, что «ваттах на квадратный MeterStringValue» не является допустимым селектором, но позвольте мне объяснить.

У меня есть категория в NSString, которая имеет ряд методов, которые выполняют разные вещи, такие как удаление пробелов из строк, или задание первого символа строки в нижнем регистре и т. Д. Эта категория существует в структуре, которую я вставляю в свою приложение.

Одним из конкретных методов в этой категории является «bindString», который преобразует строку в связующую строку верблюда. Итак:

[@ "Это фанки String" bindString]

уступит:

"thisIsAFunkyString"

То, что кажется, происходит в моем приложение под Mavericks - это то, что метод категории не всегда называется, даже если он ссылается на источник. Такое поведение является чисто случайным. Пока приложение работает, иногда оно будет вызываться, а иногда нет. Когда это не так, происходят исключения, подобные описанному выше.

Это происходит ТОЛЬКО под Mavericks. Тот же самый бинарный продукт безупречно работает под Горным Львом и Львом.

Теперь мне интересно, почему это так. Это вопрос времени выполнения Obj-C под Mavericks? Это проблема компилятора Xcode 5.0.1? Я не знаю, но это просто странно, и это подталкивает меня к стене.

Я пробовал практически все. Следующее, что я собираюсь попробовать, - вырвать категорию .m и .h из рамки и поместить ее прямо в проект приложения.

Кто-нибудь видел что-то подобное под Mavericks?

+3

В тестовом примере воспроизводится проблема. Или, по крайней мере, пример того, как вы используете категорию? – Taum

ответ

2

Подвесные категории с NSString, как правило, плохая идея. Особенно, если ваши имена методов не префиксны. Если у вас действительно есть метод с именем bindString в категории на NSString, вы можете столкнуться с методом, предоставляемым в категории где-то в рамках Apple. Когда две категории реализуют один и тот же селектор, который «выигрывает», является неопределенным.

Имейте в виду, что NSString - кластер классов. Таким образом, если метод сталкивается с методом на подклассе, вы также увидите странное поведение в том, что метод вашей категории не всегда может быть вызван.

По крайней мере, поставьте префикс на со всеми темпами в категориях по категории системы.Еще лучше, не расширяйте системные классы; поместите свои методы в свой класс.

Смежные вопросы