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

Почему самостоятельно разрешено в статическом контексте в объективе c

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

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

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

4b9b3361

Ответ 1

  • В Objective-C нет "статического контекста". Вместо этого мы имеем в виду "методы класса". Они определенно не являются "статическими" методами.
  • Методы класса (с префиксом +) - это действительно просто методы экземпляра для определенного объекта Class. (ваш ум просто взорвался?) И поскольку у вас есть переменная self, доступная в методе экземпляра, у вас, естественно, есть переменная self, доступная в методе класса.
  • В методе класса self указывает на сам класс.
  • Так же, как вы можете сделать [self performAction] внутри метода экземпляра для вызова методов в этом конкретном экземпляре, вы можете сделать [self performClassAction] внутри метода класса для вызова методов в этом конкретном классе.
  • Все объекты Class являются подклассами NSObject. Таким образом, вы можете использовать любой метод экземпляра NSObject для любого объекта Class. (ваш ум снова взорвался?)

Ответ 2

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

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

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

Ответ 3

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