Ответ
Да, имею практический опыт работы с 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
Вот так вот, блядь. Язык как язык. Не красивый, конечно, но живучий, как таракан. Иной раз смотришь на такой код и думаешь: «Ёперный театр, кто это писал?». А потом вспоминаешь — а, это же я, полгода назад. Пиздец.