Зачем отправлять класс через класс + (Class) перед вызовом метода класса? - PullRequest
4 голосов
/ 01 мая 2011

Я просматривал Sketch, пример программы, поставляемой с XCode, и продолжаю видеть подобные вещи (хотя и не всегда):

[[MyClass class] classMethod]

Теперь, поскольку MyClass не являетсяэкземпляр класса я бы просто сделал:

[MyClass classMethod]

В качестве эксперимента я смог провести различие между двумя приведенными выше утверждениями, переопределив + (Class)class и вернув еще один учебный класс!Если вы когда-нибудь захотите это сделать, вам понадобится прежняя версия, чтобы она работала, поэтому я вижу, что может использоваться для этого, но так ли это на самом деле?

Звучит как ужасная идея, подделывающая вот так +class, но, пожалуйста, просветите меня, если есть.Спасибо!


Чтобы увидеть некоторые примеры, проверьте метод -copy: в SKTGraphicsView.m в программе Sketch, найденной в Developer/Examples/Sketch/.

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

В случае, который вы цитировали, я не вижу веских причин для звонка +class. Тем не менее, есть определенно случай для вызова [[self class] doSomething] вместо [[MyClass class] doSomething]. В первом случае [self class] может вернуть правильный результат, если объект был разделен на подклассы. Во втором случае вы всегда получите объект класса MyClass, что означает, что MySubClass не может эффективно переопределить метод класса +doSomething.

0 голосов
/ 31 мая 2012

Нет веских причин для использования +class в этом случае. +class просто возвращает объект (объект класса), к которому он вызван, так же, как и -self. В большинстве случаев люди используют [SomeClass class], чтобы получить объект класса для класса, поскольку имя класса не является выражением и может использоваться только в качестве получателя в синтаксисе вызова сообщения в качестве особого случая. Поэтому во всех других контекстах они используют [SomeClass class] для получения объекта класса в качестве выражения (хотя [SomeClass self] также будет работать одинаково хорошо).

В случае, который вы показали, он является избыточным, потому что он является получателем сообщения. Я предполагаю, что они сделали это по привычке или по незнанию (они думали, что вы всегда должны писать [SomeClass class], чтобы использовать класс).

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