Недостатки использования методов класса в Objective C - PullRequest
1 голос
/ 22 апреля 2010

Мне было интересно, есть ли какие-либо недостатки памяти / производительности, или просто недостатки вообще, с использованием таких методов класса, как:

+ (void)myClassMethod:(NSString *)param {
// much to be done...
}

или

+ (NSArray*)myClassMethod:(NSString *)param {
// much to be done...
    return [NSArray autorelease];
}

Удобно помещать много функций в Class Methods, особенно в среде, где мне приходится иметь дело с управлением памятью (iPhone), но обычно есть ловушка, когда что-то удобно?

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

TomorrowsXMLResults;
TodaysXMLResults; 
YesterdaysXMLResults;
MondaysXMLResults;
TuesdaysXMLResults;
.
.
.
n

Я собираю тонну из них в своем классе веб-службы и просто создаю экземпляр класса веб-службы и позволяю методам этого класса вызывать методы класса для классов «результатов». Классы просты, но они обрабатывают большое количество Xml, создают множество объектов и т. д.

Наверное, я спрашиваю, существуют ли методы класса в стеке и в памяти или они обрабатываются иначе, чем сообщения для созданных объектов?

Или они просто созданы и снова спрятаны за кулисы и, таким образом, просто способ сохранить несколько строк кода?

Ответы [ 2 ]

10 голосов
/ 23 апреля 2010

Краткий ответ: без недостатков - используйте как ожидалось

Длинный ответ: Классы в target-c на самом деле являются объектами, которые вы можете использовать как угодно (проверьте тип возвращаемого значения - [NSObject class] - указатель на объект obj-c). Когда вы вызываете [yourclass alloc], вы фактически отправляете сообщение в ваш класс, который является объектом, описывающим класс во время выполнения. (сам метод представляет собой связку оберток вокруг malloc (), так что в этом нет никакой магии.) Что касается обработки этих объектов, ALL объекты в objc, включая классы, размещаются в куча, поэтому стек не играет никакой роли. РЕДАКТИРОВАТЬ: Просто чтобы быть ясно, нет никакой разницы в использовании метода класса, в отличие от метода экземпляра, за исключением того, что с методом класса вам не нужно иметь экземпляр класса.

для дальнейшего чтения о том, как реализованы эти объекты класса, я рекомендую http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

0 голосов
/ 23 апреля 2010

По моему опыту, методы класса или, по моему определению, статические функции служат конкретным целям. Одним из них может быть производительность, но только если они маленькие и не имеют дело с большим количеством данных. (т.е. NSString stringWithString). Если вы имеете дело с большим количеством данных, то, как вы, вероятно, знаете, ваше снижение производительности связано с обработкой данных, а не с созданием объекта. Сосредоточьтесь на том, чтобы сосредоточиться на работе с трудоемкой задачей, а не на создании объектов для выполнения этой задачи.

СПЕЦИАЛЬНЫЙ ОТВЕТ: Методы класса загружаются во время загрузки и всегда доступны для вашего приложения, накладные расходы на код для их загрузки через создание экземпляров класса минимальны по сравнению с большим объемом работы, который вы описываете. (Скорее всего, они все равно будут кэшированы)

...