Objective-C: мой класс со статическими методами "не реализует methodSignatureForSelector: - проблемы впереди" - PullRequest
5 голосов
/ 19 августа 2010

У меня есть служебный класс, который имеет только статические методы, поэтому он не наследуется от NSObject (Нет необходимости, верно?)

При компиляции вообще нет предупреждений.

Проблемаприходит при запуске на симуляторе iPhone.Он вылетает с предупреждением "не реализует methodSignatureForSelector: - проблема впереди". Мне нравится эта вещь "проблема впереди", я никогда не слышал, чтобы отладчик говорил мне, что "проблема впереди".Но что мне не нравится, так это сама ошибка ... Почему я ожидаю, что я реализую methodSignatureForSelector в классе, когда я явно вызываю статический метод?(+)

Спасибо!Daniel

Ответы [ 2 ]

10 голосов
/ 19 августа 2010

Это не идиоматический паттерн в Какао.Я настоятельно рекомендую вам пересмотреть свой дизайн.Это не Java или C ++.С одной стороны, даже не существует такого понятия, как «статический метод» - это методы класса, причем сам класс является объектом.

Также очень странно иметь класс, который не является подклассом NSObject («нет необходимости» - не очень рациональная причина отклонения от поведения по умолчанию), и даже страннее иметь класс только с методами класса.,Класс, вероятно, должен быть либо одноэлементным, либо исключенным, а его методы превращаться в функции в зависимости от того, нужно ли ему сохранять состояние.

Что касается точной причины сбоя, трудно сказать, не видякод.Это предупреждение само по себе не должно привести к сбою вашей программы.Вам нужно иметь некоторую реализацию +initialize, даже если она ничего не делает, потому что среда выполнения отправляет это сообщение каждому классу, который получает сообщение.Вероятно, именно здесь возникает ошибка - вы отправляете сообщение, среда выполнения пытается отправить initialize, ваш класс не отвечает, среда выполнения пытается вызвать механизм переадресации и не может.

0 голосов
/ 20 августа 2010

Спасибо за ответ!

О «статических» и «классовых методах», AFAIK, это просто наименование, никакой реальной разницы.Как «функции / методы» и «сообщения».

Однако это не обязательно «неправильный» дизайн.Прежде всего вы должны помнить, что в ObjC нет пространства имен, поэтому единственный способ навести порядок в вещах - это класс.Потому что, если имена двух функций сталкиваются, компилятор будет громко кричать.Иногда существуют некоторые функции, которые являются функциями «Утилиты» и работают над другими объектами или выполняют определенные вычисления, которые не могут быть напрямую связаны с определенным объектом для управления ими, а также они не должны, потому что это будет просто генерировать ненужныенакладные расходы.

Будучи очень опытным программистом на C / C ++ / Asm / Others, при программировании на ObjC я склонен всегда освобождать память сам по соображениям производительности.По тем же причинам я не хотел бы генерировать какие-либо издержки там, где это не нужно.И у ObjC много накладных расходов.

В документах также не говорится, что я ДОЛЖЕН наследоваться от NSObject, он говорит, что СЛЕДУЕТ, когда я хочу, чтобы он корректно управлялся фреймворком.

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

About + initiallize - это можно переопределить, только если класс наследует от NSObject.Таким образом, оригинальный вопрос все еще остается - зачем мне наследовать от NSObject, если я не хочу никаких его сервисов?Мне не нужно выделять класс или инициализировать его, так как я не имею ничего общего с его экземпляром!

Также странная вещь в ObjC заключается в том, что вы можете переопределить метод класса?!

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