Могу ли я встроить статические методы класса в Objective-C? - PullRequest
5 голосов
/ 20 января 2011

Вы можете объявить функции в виде строк:

#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif

так что, когда вы не в DEBUG, функция не требует затрат, потому что она оптимизирована и встроена. Что если вы хотите иметь то же самое, но для метода класса?

Мой класс объявлен так:

@interface MyClass : NSObject {

}

    + (void)DPrintf:(NSString *)format, ...;
    // Other methods of this class
@end

Я хочу преобразовать 'DPrintf' во что-то похожее на inline, чтобы не вызывать затрат на вызов метода.

Но я не могу этого сделать:

inline +(void)DPrintf:(NSString *)format, ...; {}

Как можно отключить статический метод с нулевой стоимостью для класса, не требующего отладки?

Ответы [ 3 ]

9 голосов
/ 20 января 2011

Будь осторожен.Методы Objective-C не совпадают с функциями C.Метод Objective-C переводится компилятором в вызов функции objc_msgSend();Вы не можете контролировать, является ли метод встроенным или нет, потому что это не имеет значения.Вы можете прочитать больше о среде выполнения Objective C здесь (Руководство по программированию среды выполнения Objective C) , здесь (Справочник по среде выполнения Objective C) и здесь (сообщение CocoaSamurai), и быстрый поиск в Google должен вызвать больше информации.

7 голосов
/ 20 января 2011

В Objective-C не существует такого понятия, как статический метод.Есть только методы класса, которые похожи на методы экземпляра, за исключением того, что они принадлежат классу.Это означает, что, как и методы экземпляра, сообщение, отправляемое в класс, должно пройти через механизм отправки сообщений, чтобы определить правильный метод для вызова, и это делается во время выполнения.Вы могли бы встроить вызов в механизм диспетчеризации методов, но тело метода по-прежнему нельзя встроить без безумного уровня оптимизации, которого в настоящее время нет ни в одном компиляторе Objective-C.

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

0 голосов
/ 14 ноября 2018

Да!

Вы можете сделать это с помощью блоков

-(void)viewDidLoad {

    void(^inlineFunction)(int) = ^(int argument) {
        NSLog(@"%i", argument);
    };

    inlineFunction(5);//logs '5'

}

Apple даже документирует это здесь ( архив ), так что это нечастный метод, как многие онлайн, кажется, верят.

Наслаждайтесь!

...