Подтвердить что ты не робот

Как избежать случайного переопределения метода или свойства в Objective-C

Например, я подклассифицировал UILabel и добавил метод или свойство под названием -verticalTextAlignment для выравнивания текста по вертикали.
И в будущем, если в следующей версии SDK или iOS добавлен метод или свойство с таким же именем, тогда возможно, что приложение неожиданно произойдет с ошибкой.

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

Question1
Как избежать такого рода случайного переопределения в Objective-C?
Я думаю, вы можете избежать этого, добавив все свои методы и свойства, например -XXX_verticalTextAlignment. Но это нереально, не так ли?

Вопрос2
Я знаю, что такое случайное переопределение происходит во время компиляции или при обновлении SDK для iOS, OSX SDK или XCode.

Но возможно ли это также при обновлении версии iPhone iOS?
Например, возможно ли, что ваше приложение хорошо работает на iOS5, но не работает на iOS6 из-за случайного переопределения в iOS6. (Вы можете заменить iOS5 и iOS6 на любые версии, например iOS5.0 и iOS5.1)

4b9b3361

Ответ 1

  • Да, вы можете использовать свой собственный префикс, однако это необычно.

  • Да, это может произойти после обновления O/S; Objective-C - очень динамичный язык, на котором сообщения отправляются методам, а не вызываются, как на других языках. Эти вещи разрабатываются во время выполнения, а не компилируются.

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

Ответ 2

Префикс методов вашей категории - это самый безопасный способ избежать этих конфликтов в любой растущей экосистеме, не содержащей имен cocoa.

Совершенно справедливо и разумно, что разработчики фреймворков, разработчики с открытым исходным кодом и другие отдельные разработчики должны приписывать свои методы класса.

Довольно часто я пишу методы с префиксом инициалов моей компании, а затем продолжаю этот метод.

- (void)JCMyMethodNamedSimilarToBaseClass;

Ответ 3

Вопрос 1a Категория

Используйте префикс или избегайте всего беспорядка и используйте функции.

Вопрос 1b Методы подкласса

Если метод делает что-то общее настолько, что суперкласс также может его реализовать, я просто выбираю имя метода, которое немного более "многословно", чем обычно выбирает Apple - например, задание нестандартного имени типа в имени метода, Конечно, это только уменьшает вероятность столкновения.

Если вам нужен более высокий уровень безопасности, вы можете просто проверить это при выполнении (чтобы вы знали, когда их вводят), и надейтесь, что каждый пользователь останется в курсе событий - или вы можете больше полагаться на C и/или С++ (у них нет этой проблемы).

Вопрос 2

Но возможно ли это также при обновлении версии iPhone iOS?

Да. Это не так уж необычно. Когда фреймворки обновляются (например, через обновление программного обеспечения), они могут содержать обновленные фреймворки. Этот код загружается в среду выполнения objc, и вы всегда получаете версию реализации objc установленных фреймворков.

Это также гораздо более широкая проблема в OS X, где вы можете легко и легко загружать код и/или плагины.

Ответ 4

Элегантным решением является проверка того, что метод уже существует, и только добавление его, если это не так: Условные категории в Mountain Lion