Czym jest Objective-C i dlaczego warto go poznać
Objective-C to język, który przez ponad 30 lat był fundamentem ekosystemu Apple. Każda aplikacja na iPhone’a, iPada i Maca napisana przed 2014 rokiem (i wiele po) — to Objective-C. To język, który łączy surową moc C z dynamicznym runtime’em Smalltalka, tworząc hybrydę, która jest jednocześnie potężna i… dziwna. Jeśli kiedykolwiek widziałeś składnię z nawiasami kwadratowymi wokół wywołań metod ([object message]) i myślałeś “co to jest?” — to właśnie Objective-C.
Dziś Apple promuje Swift jako przyszłość, ale Objective-C nie zniknął. Miliardy linii kodu w App Store, systemowych frameworkach Apple i legacy projektach są napisane w Objective-C. Zrozumienie tego języka to klucz do utrzymania i migracji ogromnej bazy kodu, a także do zrozumienia, dlaczego Swift wygląda tak, jak wygląda.
Objective-C to też fascynujący eksperyment w projektowaniu języków: co się stanie, gdy weźmiesz statyczny, proceduralny C i dodasz do niego dynamiczny, obiektowy system wiadomości? Odpowiedź: coś, co jest jednocześnie elastyczne jak Python i szybkie jak C — ale z składnią, która wymaga przyzwyczajenia.
Krótka historia i ewolucja
Objective-C został stworzony przez Brada Coxa i Toma Love w 1984 roku. Ich pomysł był genialny w swojej prostocie: weź C (który był standardem w przemyśle) i dodaj do niego system wiadomości Smalltalka (który był najpotężniejszym systemem obiektowym tamtych czasów). Rezultat: język, który jest w 100% kompatybilny z C, ale dodaje pełnoprawne programowanie obiektowe.
NeXT, firma Steve’a Jobsa po jego odejściu z Apple, wybrała Objective-C jako główny język dla swojego systemu operacyjnego NeXTSTEP. Gdy Apple kupiło NeXT w 1997 roku, NeXTSTEP stał się podstawą Mac OS X, a Objective-C stał się językiem Apple. Przez następne 17 lat Objective-C był jedynym “oficjalnym” językiem do pisania aplikacji na platformy Apple.
W 2014 roku Apple wprowadziło Swift, który miał zastąpić Objective-C. Od tego czasu Objective-C jest w powolnym odwrocie, ale wciąż jest wspierany, rozwijany (nowoczesne features jak ARC, blocks, literals) i używany w produkcji. Apple nie ogłosiło end-of-life dla Objective-C, i prawdopodobnie nie zrobi tego przez najbliższe dekady — zbyt wiele kodu od niego zależy.
Kluczowe cechy i filozofia
Objective-C to C z nałożoną warstwą obiektową. Każdy plik .m (Objective-C) może zawierać dowolny kod C — nie ma tu “Objective-C bez C”. To oznacza, że masz pełną moc (i pełne niebezpieczeństwo) C, plus dynamiczny system obiektowy.
System wiadomości (message passing) to serce Objective-C. Zamiast wywoływać metody (object.method()), wysyłasz wiadomości ([object message]). Różnica nie jest tylko składniowa — w Objective-C, wiadomość jest rozwiązywana w runtime, nie w compile-time. To oznacza, że możesz wysłać dowolną wiadomość do dowolnego obiektu, i jeśli obiekt nie odpowiada, dostajesz runtime error (lub możesz obsłużyć to dynamicznie przez forwardInvocation:). To daje elastyczność, o której statyczne języki mogą tylko pomarzyć.
Typowanie w Objective-C jest… hybrydowe. Masz statyczne typy (NSString *name), ale runtime jest dynamiczny — możesz rzutować, sprawdzać typy w runtime (isKindOfClass:), i używać id (typ “dowolny obiekt”) tam, gdzie potrzebujesz elastyczności. To podejście, które łączy bezpieczeństwo statycznego typowania z elastycznością dynamicznego — choć wymaga dyscypliny od programisty.
Filozofia Objective-C to “C z supermocami”. Nie próbuje ukryć C — buduje na nim. To oznacza, że musisz rozumieć wskaźniki, zarządzanie pamięcią i niskopoziomowe mechanizmy, ale w zamian dostajesz pełną kontrolę i wydajność. ARC (Automatic Reference Counting) uprościło zarządzanie pamięcią, ale nie wyeliminowało go całkowicie.
Gdzie Objective-C sprawdza się najlepiej
Objective-C sprawdza się w jednym konkretnym kontekście: aplikacjach na platformy Apple. iOS, macOS, watchOS, tvOS — Objective-C był (i wciąż jest) językiem pierwszego wyboru dla tych platform. Frameworki jak UIKit, AppKit, Foundation i Core Data są napisane w Objective-C i mają Objective-C API.
Dziś nowe projekty na platformy Apple zazwyczaj zaczynają się w Swift, ale Objective-C wciąż jest używany do: utrzymywania legacy kodu, pisania bibliotek, które muszą być kompatybilne z oboma językami, i w firmach, które mają duże bazy kodu w Objective-C i nie mogą sobie pozwolić na pełną migrację.
Poza ekosystemem Apple, Objective-C nie ma praktycznych zastosowań. GNUstep (otwartoźródłowa implementacja frameworków NeXTSTEP) istnieje, ale jest niszowy. Objective-C to język jednej platformy — ale tej platformy, która jest warta biliony dolarów.
Jak wygląda kod w Objective-C
#import <Foundation/Foundation.h>
@interface Silnia : NSObject
- (NSInteger)oblicz:(NSInteger)n;
@end
@implementation Silnia
- (NSInteger)oblicz:(NSInteger)n {
if (n == 0) {
return 1;
}
return n * [self oblicz:n - 1];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Silnia *s = [[Silnia alloc] init];
NSInteger wynik = [s oblicz:10];
NSLog(@"Silnia z 10 = %ld", (long)wynik);
}
return 0;
}
Charakterystyczna składnia Objective-C: nawiasy kwadratowe dla wiadomości, @interface/@implementation dla klas, i [[Class alloc] init] dla tworzenia obiektów. Dla niewtajemniczonych wygląda to jak szum — dla weteranów to czysta poezja.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIButton *button;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 40)];
self.label.text = @"Witaj, Objective-C!";
[self.view addSubview:self.label];
self.button = [UIButton buttonWithType:UIButtonTypeSystem];
[self.button setTitle:@"Kliknij mnie" forState:UIControlStateNormal];
[self.button addTarget:self action:@selector(buttonTapped:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.button];
}
- (void)buttonTapped:(UIButton *)sender {
self.label.text = @"Przycisk kliknięty!";
}
@end
Typowy kod UIKit w Objective-C — tworzenie UI, target-action pattern z @selector. To jest kod, który miliony developerów iOS pisały codziennie przez lata.
Ekosystem i narzędzia
Ekosystem Objective-C jest nierozerwalnie związany z Apple. Xcode to jedyne sensowne IDE — darmowe, z pełnym wsparciem dla Objective-C, debuggingiem (LLDB), profilingiem (Instruments) i integracją z frameworkami Apple. Alternatywy jak AppCode (JetBrains) były popularne, ale JetBrains wycofało wsparcie.
Frameworki Apple to korona ekosystemu: Foundation (kolekcje, stringi, daty), UIKit (iOS UI), AppKit (macOS UI), Core Data (baza danych), Core Animation, i setki innych. Wszystkie mają Objective-C API, nawet jeśli są też dostępne z Swift. CocoaPods i Carthage to menedżery zależności, które działają z Objective-C (choć Swift Package Manager powoli je zastępuje).
Społeczność Objective-C jest duża, ale malejąca. Stack Overflow ma tysiące pytań o Objective-C, ale nowe pytania są coraz rzadsze. Konferencje Apple (WWDC) wciąż mają sesje o Objective-C, ale skupiają się na Swift. To społeczność w fazie “graceful decline” — wciąż aktywna, ale nie rosnąca.
Mocne i słabe strony
Mocne strony Objective-C to dynamiczny runtime (elastyczność, introspekcja, swizzling), pełna kompatybilność z C (możesz używać dowolnej biblioteki C), dojrzałe frameworki Apple i ogromna baza istniejącego kodu. Objective-C jest też “battle-tested” — dekady produkcji na miliardach urządzeń to najlepszy test.
Słabe strony to składnia (nawiasy kwadratowe i verbose API odstraszają nowych developerów), brak nowoczesnych mechanizmów językowych (brak generics w stylu Swift, brak optionals, brak pattern matching), i zależność od Apple. Objective-C nie jest przenośny — nie napiszesz w nim backendu, aplikacji na Androida czy gier na konsolę. I wreszcie — Apple wyraźnie inwestuje w Swift, co oznacza, że Objective-C nie dostaje nowych features.
Podsumowanie
Objective-C to język, który zbudował ekosystem Apple i zmienił sposób, w jaki miliardy ludzi korzystają z technologii. Jeśli pracujesz z platformami Apple — szczególnie z legacy kodem — Objective-C jest niezbędny. Nawet jeśli piszesz tylko w Swift, zrozumienie Objective-C uczyni cię lepszym developerem iOS/macOS, bo zrozumiesz, dlaczego frameworki działają tak, jak działają.
Przyszłość Objective-C to powolne, ale godne wycofywanie się. Apple nie zabije go nagle (zbyt wiele kodu od niego zależy), ale nie będzie go też aktywnie rozwijać. Objective-C będzie istnieć przez dekady jako “legacy language” — ale jako legacy language, który wciąż działa, wciąż jest wspierany i wciąż jest wart znajomości. To język, który zasłużył na szacunek — i na dobre miejsce w historii.

