O.G. O.C.

Objective-C существует уже давно, и мне нравится с ним работать. Моя единственная жалоба - это очень многословно (много текста). Но многословие имеет именованные параметры. Эта функция, похоже, появилась в других языках лишь позже. Что еще делает Objective-C O.G.?

Objective-C был разработан в 1980-х годах и использовался компанией Стива Джобса NextStep. NextStep в конечном итоге был куплен Apple, и родилась OSX. На самом деле вы можете не знать, что префикс NS взят из NextStep. И, конечно же, ОС Next Steps была основана на микроядре mach (unix).

Самая очевидная функция Objective-C — необязательная. Вы можете получить доступ к дополнительному методу с помощью скобок, как в [метод объекта]. Если объект равен нулю, метод является нупом (нет операции). Это действительно делает код красивым и чистым, с меньшим количеством проверок на ноль в каждом операторе. Эквивалент необязательной цепочки.

Еще одна особенность, на которую я мог бы указать, — это буквальность. Итак, у вас есть буквальная строка с @”здесь”. Но вы также можете использовать это для других литералов, таких как словари, списки и NSInteger:

NSArray *arr = @[@”1', @”2', @”3'];

NSDictionary *dict = @{@”1':@1, @”2':@2, @”3':@3};

Это довольно удобно и просто, вам не кажется?

Итак, это пара интересных функций, но давайте углубимся. Нельзя забывать и об ARC (автоматическом подсчете ссылок). Это может показаться тривиальным, но это здорово — не отслеживать «владение» посредством подсчета ссылок. Это определенно одна из самых крутых особенностей Objective-C.

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

Ниже я привожу простой пример использования ванильного объекта и использования так называемого связанного объекта, вы можете по существу добавлять геттеры и сеттеры. Ниже я просто использовал методы, упрощающие задачу. Я также добавил их в инициализацию, что не идеально.

NS_ASSUME_NONNULL_BEGIN

@interface Player : NSObject

@end

NS_ASSUME_NONNULL_END
#import "Player.h"
#import <objc/runtime.h>

@implementation Player
- (instancetype)init {
    if (self = [super init]) {
        // Initialize self
        //Class clazz = objc_allocateClassPair(self, "Player2", 0);
        BOOL v = class_addMethod([self class], @selector(setMyObject), (IMP) setMethodIMP, "v@:@");
        v = class_addMethod([self class], @selector(getMyObject), (IMP) getMethodIMP, "@@:");

        
    }
    return self;
}
void setMethodIMP(id self, SEL _cmd, id val)
{
    // implementation ....
    objc_setAssociatedObject(self, "myNewObject", val, OBJC_ASSOCIATION_RETAIN);
}

id getMethodIMP(id self, SEL _cmd)
{
    // implementation ....
    return objc_getAssociatedObject(self, "myNewObject");
}
- (void)dealloc {
    objc_removeAssociatedObjects(self);
}
@end

Я взял ванильный объект и добавил метод установки и получения нового объекта. Связанный объект — это связанная карта, которая поставляется с каждым NSObject и позволяет добавлять переменные с помощью связанной карты вместе с расширением класса.

    Player *p = [[Player alloc] init];
    
    SEL sel = @selector(setMyObject);
    NSString *str = @"Objective-C is powerful !";
   
    [p performSelector:sel withObject:str];
    
    id val = [p performSelector:@selector(getMyObject)];

Поскольку среда выполнения поддерживает PerformSelector, вы можете вызывать методы во время выполнения по имени, не зная ничего о реальном классе или объекте. Как вы можете видеть выше, PerformSelector можно использовать для вызова методов, добавленных во время выполнения. Довольно круто!

Вы также можете использовать категории для создания расширений для существующих классов. Категория по сути добавляет метод в класс во время компиляции, а не во время выполнения. Но вы могли увидеть, как можно использовать связанные объекты вместе с категориями, чтобы добавить некоторые полезные функции к классам в других пакетах.

Существуют также функции наблюдения за значением ключа, которые можно добавить на уровне NSObject, чтобы получать уведомления об изменении значения ключа объекта. Шаблон наблюдателя ключевых значений — очень мощная функция.

Наконец, давайте не будем забывать о блоках как объектах (они похожи на функции, но их можно присваивать переменным и передавать в качестве аргументов). Обработчик завершения — это довольно постоянный шаблон в Objective-C.

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

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