Почему самостоятельно разрешено в статическом контексте в объективе c
Почему использование self
разрешено в статическом контексте в Objective-C?
Я думал, что это разрешено, а затем я столкнулся с ошибками памяти, которые потребовали мне неделю, чтобы узнать, что self
не является псевдонимом для вызова других статических методов из класса вместо ввода имени класса.
Xcode и его компилятор кажутся очень умными в поиске общих ловушек, почему он даже не генерирует предупреждение о чем-то подобном?
Ответы
Ответ 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
ссылается на объект класса при использовании в методах класса. Это то, что вы подразумеваете под "статическим контекстом"? Если да, то какие ошибки памяти у вас есть, если вы предложили иначе?