Перейти к основному содержимому

Objective-C — о разделе

Черновик раздела. Материалы будут дополняться; ниже — структура, ключевые идеи messaging/runtime и черновые статьи для чтения legacy-кода Apple.

Objective-C — язык Apple до доминирования Swift:

  • сообщения в стиле Smalltalk поверх синтаксиса C;
  • фреймворки Foundation, UIKit, AppKit;
  • ARC (Automatic Reference Counting) для управления памятью объектов.

Раздел нужен для чтения legacy-кода iOS/macOS, поддержки старых модулей и понимания bridge в Swift.

МатериалЗачем
История языкаNeXT, Apple, переход к Swift
Первая программаXcode, clang, Foundation
Swift introСовременный стек Apple
Smalltalk introМодель сообщений

Что такое Objective-C простыми словами

Objective-C = C + объектная модель с сообщениями. Вместо obj.method(arg) пишут [obj method:arg]. Runtime динамический: можно отправить сообщение объекту, даже если метод объявлен в category позже.

АспектObjective-CSwift
Синтаксис[ ], @ directivesСовременный, типобезопасный
Null для объектовnilOptionals
ПамятьARC (раньше MRC вручную)ARC + value types
Новые API AppleLegacy headers, @objcSwift-first

Новые приложения пишут на Swift; Objective-C остаётся в системных фреймворках, open source (AFNetworking era, FFmpeg bindings) и миллионах строк legacy в App Store.


Планируемое содержание

ТемаСтатус
1История языкачерновик
2Синтаксис, @interface, @implementationпланируется
3Messaging, nil, протоколыпланируется
4Memory management — MRC и ARCпланируется
5Foundation — NSString, NSArray, NSDictionaryпланируется
6Interop Swift ↔ Objective-Cпланируется
7Первая программачерновик
8+UIKit lifecycle, миграция на Swiftпланируется

Ключевые идеи раздела

Messaging, не вызов метода

NSString *s = @"Hello";
NSString *upper = [s uppercaseString];

Компилятор превращает в objc_msgSend. Динамическая диспетчеризация — основа swizzling и KVO (Key-Value Observing) в legacy-коде.

Directives @

ДирективаНазначение
@interface / @implementationОбъявление и реализация класса
@propertyГеттер/сеттер + backing ivar
@protocolАналог interface в Java
@selectorУказатель на метод для runtime
Literals @"...", @[], @{}NSString, NSArray, NSDictionary

ARC

Компилятор вставляет retain/release/autorelease автоматически. В @autoreleasepool объекты освобождаются в конце scope. До 2011 года MRC (Manual Reference Counting) требовал ручного release — читать старый код без паники.

Categories и protocols

Category добавляет методы существующему классу без подкласса. Protocol — контракт методов (<UITableViewDelegate>). Swift унаследовал идеи через extensions и protocols.


Инструменты

ИнструментНазначение
XcodeIDE, симулятор, Interface Builder
clangКомпилятор Obj-C и Swift
InstrumentsПрофилирование памяти и CPU
lldbОтладчик в терминале и Xcode

Разработка Objective-C для Apple-платформ — на macOS. Linux GNUstep — нишевый путь вне основного раздела.


Порядок чтения

  1. История языка — NeXT → Apple → Swift.
  2. Первая программа — CLI Hello World, @interface.
  3. Messaging и Foundation (статьи 2–5).
  4. Bridging header и mixed Swift/Obj-C (статья 6).

Параллельно полезны C++ (синтаксис C) и Smalltalk (философия сообщений).


Кому подойдёт раздел

СценарийЗачем Objective-C
Поддержка legacy iOS-модуляЧитать без полного rewrite
Mixed Swift/Obj-C проектBridging, @objc
Понимание Apple SDKМногие headers Obj-C
Open source на GitHubСтарые библиотеки

Новый UI-код — Swift; Objective-C — страховка для maintenance и собеседований в компаниях с длинной историей iOS.


Связанные разделы

РазделСвязь
SwiftПреемник, interop
SmalltalkMessaging model
C++Синтаксическая база C
Мобильные приложенияКонтекст платформы
Черновик

Статьи 2–6 в плане. Черновики истории и первой программы содержат рабочие команды clang и фрагменты @interface.


Пошаговый маршрут на две недели

ДеньЗадачаРезультат
1–27.md CLI Hello Worldclang -fobjc-arc работает
3Literals @"", @[], @{}Foundation collections
41.md история + messagingПонимание NeXT lineage
5@property strong/weak/copyARC qualifiers
6Protocol + delegate (read-only)UIKit header pattern
7Bridging header в mixed projectSwift вызывает Obj-C
8–10Legacy file на GitHubАннотации в .m
Практика

Не начинайте с storyboard. Сначала CLI + Foundation, затем один legacy ViewController только для чтения. Так быстрее связывается messaging с реальным кодом.


Учебный разбор retain cycle

@interface Worker : NSObject
@property (nonatomic, copy) void (^onDone)(void);
@end

@implementation Worker
- (void)start {
self.onDone = ^{
[self cleanup]; // cycle: block → self → block
};
}
- (void)cleanup {}
@end

Исправление — __weak typeof(self) weakSelf = self; в block. Отладка — Instruments Leaks и отладка.


Foundation literals — шпаргалка

NSString *s = @"text";
NSNumber *n = @42;
NSArray *a = @[s, n];
NSDictionary *d = @{@"key": s};
for (NSString *item in a) { NSLog(@"%@", item); }
LiteralКласс
@"..."NSString
@[]NSArray
@{}NSDictionary
@42NSNumber

Interop Swift (кратко)

  1. Bridging header: #import "LegacyManager.h".
  2. Swift class для Obj-C: @objcMembers class Foo: NSObject.
  3. Generated header Target-Swift.h в .m.

Подробнее — Swift intro, Git workflow — Git.


Упражнения

  1. Соберите Hello World из 7.md без Xcode GUI.
  2. Class Counter с -increment и property count.
  3. NSArray из трёх имён — fast enumeration + NSLog.
  4. Намеренный retain cycle → Instruments.
  5. Найдите @protocol в UIKit header.
  6. Swift @objc class, вызов из .m.
  7. Stack trace с objc_msgSend — найти selector.
  8. Сравните nil messaging с Swift Optional.
  9. Прочитайте open source .m на GitHub.
  10. Объясните - vs + на примере NSString.

Troubleshooting

СимптомПричинаРешение
Foundation.h not foundНет -framework FoundationФлаг clang
Unrecognized selectorTypo или wrong classpo [obj class] в lldb
Bridging header missingBuild SettingsSWIFT_OBJC_BRIDGING_HEADER
Duplicate symbol.m в двух targetsTarget Membership
Leakstrong в blockweakSelf
Swift invisible in Obj-CНет @objcNSObject + @objcMembers
Autorelease warningHot loop@autoreleasepool
Code signingProvisioningAutomatic signing

FAQ

Нужен ли Objective-C новичку Apple-разработчику? Для новых app — Swift достаточно. Obj-C — legacy, headers, mixed targets.

Чем messaging отличается от вызова функции? Runtime ищет IMP по selector; позднее binding, categories.

Что такое selector? Имя метода в runtime, тип SEL (stringWithFormat:).

Зачем @autoreleasepool? Drain autorelease objects в scope CLI программ.

MRC ещё актуален? Только в очень старых кодовых базах.

Categories безопасны? Конфликт при одинаковых selectors — осторожно в categories на системных классах.

Blocks и GCD? Closures + Grand Central Dispatch — legacy concurrency до Swift async.

Obj-C без macOS? GNUstep — niche; iOS dev — macOS + Xcode.

Как читать .h? @interface public; @implementation в .m.

Что такое instancetype? Typed return для [[Class alloc] init].

IBOutlet / IBAction? Storyboard bindings; legacy UIKit.

Migration на Swift? Module за module, bridging header, @objc exposure.

Где практиковать без устройства? Simulator; CLI Foundation на macOS.

Open source Obj-C? GitHub: старые iOS libs, FFmpeg bindings.

Связь со Smalltalk? Message passing без функционального Smalltalk runtime — Smalltalk intro.


Дополнительные упражнения раздела

  1. Xcode workspace: CLI tool + unit test target.
  2. Найдите @protocol с @optional в UIKit header.
  3. Diagram retain graph: strong vs weak delegate.
  4. Crash log с objc_msgSend — найти selector.
  5. Mixed target: Swift вызывает Greeter.
Платформа

iOS-сборка требует macOS. GNUstep на Linux не заменяет UIKit tutorial path.


Instruments и профилирование (обзор)

Instruments в Xcode профилирует Obj-C/Swift: Leaks, Time Profiler, Allocations. Legacy Obj-C часто показывает retain cycles в delegate chains — ищите strong delegate properties.


Ключевые префиксы Apple API

ПрефиксПроисхождение
NSNeXTstep / Foundation
UIUIKit (iOS)
CGCore Graphics (C)
CFCore Foundation (C, toll-free bridge)

Чтение headers проще, когда префикс указывает на слой стека.


Чек-лист раздела Objective-C

  • Прочитана история
  • Собран Hello World через clang или Xcode
  • Объяснено отличие messaging от C function call
  • Понятны ARC и strong/weak
  • Открыт Swift intro для mixed targets

WWDC и migration resources

Apple публикует guides по постепенной миграции Obj-C → Swift: mixed targets, @objc exposure, nullability annotations в headers. Полезно при чтении legacy UIKit code.


Типичные символы в crash logs

SymbolЗначение
objc_msgSendDynamic dispatch
-[Class method:]Instance method
+[Class method]Class method

Умение читать stack trace ускоряет отладку legacy apps.


FAQ (дополнение раздела)

Obj-C для App Store в 2026? Новые apps Swift; Obj-C для maintenance.

GNUstep карьера? Не для iOS jobs.

clang без Xcode? CLT enough for Foundation CLI.

Reading order summary? 1.md7.md → Swift interop.


Связанные материалы (итог)

СтатьяТема
1.mdИстория NeXT и Apple
7.mdCLI Hello World
SwiftСовременный стек
GitВерсионирование