Имеете ли вы опыт работы с Objective-C?

Ответ

Да, имею практический опыт работы с Objective-C, преимущественно в контексте поддержки и модернизации legacy-кода в iOS-проектах, а также для интеграции со специфичными библиотеками и низкоуровневыми фреймворками Apple.

Ключевые области опыта:

  • Поддержка и рефакторинг смешанных проектов (Swift/Objective-C), использование Bridging Headers.
  • Работа с API, которые изначально написаны на Objective-C (например, некоторые части CoreFoundation, CoreGraphics, старые версии SDK).
  • Понимание ручного управления памятью (MRC) и Automatic Reference Counting (ARC).
  • Использование ключевых концепций языка: селекторы (@selector), категории (Categories), расширения (Extensions), протоколы, блоки (blocks).
  • Базовое понимание Objective-C Runtime.

Пример объявления класса и реализации:

// MyClass.h
@interface MyClass : NSObject
@property (nonatomic, strong, readonly) NSString *identifier;
@property (nonatomic, assign) NSInteger count;
- (instancetype)initWithIdentifier:(NSString *)identifier;
- (void)performActionWithCompletion:(void (^)(BOOL success))completion;
@end

// MyClass.m
#import "MyClass.h"
@implementation MyClass
- (instancetype)initWithIdentifier:(NSString *)identifier {
    self = [super init];
    if (self) {
        _identifier = [identifier copy];
        _count = 0;
    }
    return self;
}
- (void)performActionWithCompletion:(void (^)(BOOL))completion {
    // Некоторая логика...
    self.count++;
    if (completion) {
        completion(YES);
    }
}
@end

Ответ 18+ 🔞

Да ты посмотри, какой я, блядь, уникум! Objective-C, сука, на нём разговариваю, как на родном. Не то что эти молодые, на Swift'е только и могут, что языком молоть. А я, блядь, в этих ваших legacy-проектах, как рыба в говне — плаваю, не замечая.

Где руки мои кривые успели всё облапать:

  • Поддержка и рефакторинг этих вот гибридных уродцев, где Swift с Objective-C в одном флаконе, как водка с пивом. Bridging Headers — моя, блядь, вторая натура, хуле.
  • Работа с API, которые ещё наши деды писали, на CoreFoundation всяком. Там такой код, что волосы дыбом, но разобраться можно, если не бздеть.
  • Понимаю разницу между ручным управлением памятью (MRC), где сам, как дурак, retain/release расставляешь, и ARC, где компилятор за тебя думает. И то, и другое — сплошная головная боль, но жить можно.
  • Использую все эти ихние штуки: селекторы (@selector), которые как проклятые, категории (Categories), чтобы классы, блядь, без спроса расширять, блоки (blocks) — ну, эти ещё куда ни шло, если не запутываться.

Вот, смотри, как это выглядит, когда я не сплю ночами:

// MyClass.h - тут мы, блядь, всем рассказываем, что будем делать
@interface MyClass : NSObject
@property (nonatomic, strong, readonly) NSString *identifier; // Только читай, не пиши, а то отъебу
@property (nonatomic, assign) NSInteger count; // А вот эту циферку можно менять
- (instancetype)initWithIdentifier:(NSString *)identifier; // Конструктор, ёпта
- (void)performActionWithCompletion:(void (^)(BOOL success))completion; // Сделаю дело и позвоню
@end

// MyClass.m - а тут мы, сука, уже делаем
#import "MyClass.h"
@implementation MyClass
- (instancetype)initWithIdentifier:(NSString *)identifier {
    self = [super init]; // Предков почтим
    if (self) { // Если нас не обделили памятью, живём
        _identifier = [identifier copy]; // Скопируем, чтобы свою копию иметь
        _count = 0; // Начинаем с нуля, как все
    }
    return self; // Вот мы и родились
}
- (void)performActionWithCompletion:(void (^)(BOOL))completion {
    // Тут какая-нибудь ебаная логика...
    self.count++; // Сделали раз — плюсик в карму
    if (completion) { // А если нам пообещали перезвонить...
        completion(YES); // ...то звоним и говорим, что всё заебок
    }
}
@end

Вот так вот, блядь. Язык как язык. Не красивый, конечно, но живучий, как таракан. Иной раз смотришь на такой код и думаешь: «Ёперный театр, кто это писал?». А потом вспоминаешь — а, это же я, полгода назад. Пиздец.