Почему я допускается в статическом контексте в цели c - PullRequest
40 голосов
/ 13 июня 2011

Почему использование self разрешено в статическом контексте в Objective-C?

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

Xcode и его компилятор, кажется, очень умны в поиске распространенных ошибок, почему он даже не генерирует предупреждение о чем-то подобном?

Ответы [ 3 ]

83 голосов
/ 13 июня 2011
  1. В Objective-C не существует такого понятия, как "статический контекст". Вместо этого мы имеем «методы класса». Это определенно не"статические" методы.
  2. Методы класса (с префиксом +) на самом деле просто методы экземпляра для конкретного Class объекта. (ваш разум просто взорвался?) И поскольку у вас есть переменная self, доступная в методе экземпляра, у вас, естественно, есть переменная self, доступная и в методе класса.
  3. В методе класса self указывает на сам класс .
  4. Так же, как вы можете сделать [self performAction] внутри метода экземпляра для вызова методов в этом конкретном экземпляре, вы можете сделать [self performClassAction] внутри метода класса для вызова методов этого конкретного класса.
  5. Все Class объекты являются подклассами NSObject. Таким образом, вы можете использовать любой NSObject метод экземпляра для любого Class объекта. (твой разум просто снова взорвался?)
8 голосов
/ 13 июня 2011

self допускается только в контексте метода Objective-C.Под «статическим контекстом» я предполагаю, что вы имеете в виду внутри метода класса (то есть тот, чья сигнатура начинается с +, а не -.). Ваше утверждение, что «self не является псевдонимом для вызова других статических методов»,неверно.

self разрешено в этих случаях, так что вы можете:

  1. передавать класс как объект, поскольку все классы Objective C сами являются объектами
  2. отправляет сообщения классу без указания имени класса, если метод переопределен в подклассе ([Foo bar] всегда будет использовать реализацию Foo; [self bar] будет использовать любую реализацию, доступную в self.)
5 голосов
/ 13 июня 2011

Это разрешено, потому что self действительно ссылается на объект класса при использовании в методах класса.Это то, что вы подразумеваете под «статическим контекстом»?Если да, то какие у вас были ошибки памяти, которые предполагали иначе?

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