Objective-C: ano ang esensya ng wika at lugar nito sa iOS development

May-akda: IT Sectr Nai-publish: 2026-02-09 Oras ng pagbabasa: 8 min

Objective-C — isang programming language na may dynamic na pagpapadala ng mensahe, nilikha ni Brad Cox noong 1980s. Pinili ng Apple ang Objective-C bilang pangunahing wika para sa NeXTSTEP, at pagkatapos ay para sa iOS SDK. Programming With Objective-C — panimula sa syntax ng mensahe at pamamahala ng memorya.

Mga Pangunahin

  • Objective-C — mahigpit na superset ng C na may syntax ng mensahe sa mga square bracket at dynamic na runtime
  • Message passing — pagtawag ng metodo sa pamamagitan ng [object selector:argument] na may dynamic na paghahanap ng implementasyon sa pamamagitan ng objc_msgSend
  • Categories — mekanismo ng pagdaragdag ng mga metodo sa umiiral na mga klase walang mana at walang access sa source code
  • Blocks — mga anonymous na function na may closure, nauna sa Swift closures
  • ARC vs MRC — awtomatiko at manu-manong pagbilang ng reference para sa pamamahala ng memorya

Ano ang Objective-C?

Objective-C — isang programming language na nagpapalawak ng C ng mga kakayahan sa object-oriented programming sa istilo ng Smalltalk. Ang code ng Objective-C ay compile sa pamamagitan ng LLVM o GCC sa native machine code, na pinapanatili ang kumpletong backward compatibility sa C — anumang C code ay tama sa Objective-C.

Nakuha ng Apple ang NeXT (kasama ang Objective-C) noong 1997. Ang wika ay naging batayan ng Cocoa at Cocoa Touch — mga framework para sa macOS at iOS. Mula noong 2014, itinutulak ng Apple ang Swift bilang kapalit, ngunit nananatiling mahalaga ang Objective-C para sa mga legacy na proyekto at ilang system framework. Ayon sa Apple (WWDC 2024), humigit-kumulang 35% ng mga app sa App Store ay naglalaman pa rin ng Objective-C code.

Pangunahing tampok — dynamic na runtime. Hindi tulad ng Swift, kung saan ang mga pagtawag ng metodo ay nare-resolve sa yugto ng compilation, nagpapadala ang Objective-C ng mga mensahe sa panahon ng execution sa pamamagitan ng function na objc_msgSend. Pinapayagan nito ang pag-override ng mga metodo on the fly (method swizzling), dynamic na pagdaragdag ng mga klase, at paggamit ng forward invocation para sa mga selector na hindi umiiral.

Syntax: C + object layer

Anumang C code ay tama sa Objective-C. Ang object layer ay nagdaragdag ng mga klase (@interface/@implementation), kategorya, protocol (@protocol) at dynamic na pag-type (id). Ang mga file ay may ekstensyon na .m (implementasyon) at .h (header).

Syntax ng mensahe at dynamic na pagpapadala

Syntax ng mensahe — pangunahing pagkakaiba ng Objective-C sa mga wikang tulad ng C. Sa halip na object.method(argument) ay ginagamit ang [object method:argument]. Bawat mensahe ay dumadaan sa objc_msgSend, na dynamic na naghahanap ng implementasyon ng metodo sa runtime.

objective-c
// Syntax ng mensahe na may pinangalanang parameter
NSString *greeting = [NSString stringWithFormat:@"Hello, %@", name];

// Mga nested na mensahe
NSArray *sortedArray = [[array sortedArrayUsingSelector:@selector(compare:)] copy];

// Pagsusuri ng uri sa pamamagitan ng introspection
if ([object isKindOfClass:[UIView class]]) {
    UIView *view = (UIView *)object;
    view.backgroundColor = [UIColor redColor];
}

Dynamic dispatch ay nagpapahintulot ng pag-override ng mga metodo sa runtime (method swizzling) — isang makapangyarihan ngunit mapanganib na teknik. Halimbawa, ang mga framework tulad ng AFNetworking at Aspects ay gumagamit ng swizzling para sa pag-intercept ng mga tawag sa URLSession. Nagbabala ang Apple: ang swizzling ay maaaring makagambala sa paggana ng mga system framework kung ginamit nang hindi tama.

Mga kategorya at ekstensyon ng klase

Categories — natatanging kakayahan ng Objective-C na magdagdag ng mga metodo sa umiiral na mga klase (kasama ang system, tulad ng NSString at UIView) walang mana at walang access sa source code. Ang mga kategorya ay idineklara sa pamamagitan ng @interface ClassName (CategoryName).

objective-c
// File na UIColor+Hex.h — kategorya para sa UIColor
@interface UIColor (Hex)
+ (instancetype)colorWithHex:NSUIntegerhex;
@end

// File na UIColor+Hex.m — implementasyon
@implementation UIColor (Hex)
+ (instancetype)colorWithHex:NSUIntegerhex {
    CGFloat r = ((hex >> 16) & 0xFF) / 255.0;
    CGFloat g = ((hex >> 8) & 0xFF) / 255.0;
    CGFloat b = (hex & 0xFF) / 255.0;
    return [self colorWithRed:r green:g blue:b alpha:1.0];
}
@end

Extensions (Class Extension) — isang espesyal na uri ng kategorya, na idineklara sa .m file walang pangalan: @interface ClassName (). Hindi tulad ng mga kategorya, ang extensions ay maaaring magdagdag hindi lamang ng mga metodo, kundi pati na rin ng ivar (instance variables) at property. Ginagamit ang extensions para sa pagtatago ng internal na API mula sa mga external na module.

Mga bloke — mga anonymous na function na may closure

Blocks — mga anonymous na function sa Objective-C na kumukuha ng mga variable mula sa external na scope. Syntax ng mga bloke: ^(int x) { return x * 2; }. Ginagamit ang Blocks sa UIKit para sa callback handler, sa Grand Central Dispatch para sa asynchronous na gawain, at sa mga koleksyon ng NSArray/NSDictionary para sa functional na operasyon.

objective-c
// Deklarasyon ng uri ng bloke
typedef void (^CompletionBlock)(BOOL success, NSError *error);

// Bloke bilang parameter
- (void)fetchDataWithCompletion:(CompletionBlock)completion {
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        BOOL result = [weakSelf processData];
        if (completion) {
            completion(result, nil);
        }
    });
}

Pamamahala ng memorya sa mga bloke ay kritikal. Kinukuha ng mga bloke ang self na may malakas na reference, na lumilikha ng retain cycle sa direktang paggamit. Solusyon — __weak typeof(self) weakSelf = self, na may kasunod na pagsusuri sa loob ng bloke. Ang problemang ito ay ganap na nalutas sa Swift sa pamamagitan ng capture list [weak self].

ARC at MRC: pamamahala ng memorya

Ang Objective-C ay dumaan sa landas mula MRC (Manual Reference Counting) hanggang ARC (Automatic Reference Counting). Sa MRC, ang programmer ay manu-manong tumatawag ng retain (pagtaas ng counter), release (pagbaba) at autorelease (naantalang release). Ang mga pagkakamali sa mga tawag na ito ay nagdudulot ng mga leak ng memorya o crash dahil sa dangling pointers.

OperasyonMRCARC
Paglikha ng object[[Object alloc] init][[Object alloc] init]
Pagpapanatili ng reference[object retain]Awtomatiko
Pagpapalaya[object release]Awtomatiko
Awtomatikong pagpapalaya[object autorelease]Awtomatiko (hindi kinakailangan)
Weak reference__weak ay wala__weak (awtomatikong nil)

Ang ARC ay ipinakilala sa Xcode 4.2 at LLVM 3.0 (2011). Ang compiler ay awtomatikong naglalagay ng retain/release sa yugto ng compilation, na sinusuri ang lifetime ng mga object. Ang ARC ay hindi garbage collection — ito ay static analysis na may awtomatikong paglalagay. Ang Objective-C ARC ay compatible sa Swift ARC: pareho silang gumagamit ng parehong sistema ng pagbilang ng reference sa antas ng runtime.

Pakikipag-ugnayan sa Swift sa pamamagitan ng Bridging Header

Ang pinagsamang paggamit ng Objective-C at Swift sa isang proyekto — karaniwang kasanayan para sa mga legacy na proyekto. Nagbibigay ang Apple ng Bridging Header — isang file na awtomatikong nabubuo kung saan nakikita ng Swift ang mga Objective-C na klase, at nakikita ng Objective-C ang mga Swift na klase na nagmana mula sa NSObject.

objective-c
// ProjectName-Bridging-Header.h
// Awtomatikong nakikita ng Swift ang mga header na ito
#import "LegacyManager.h"
#import "NetworkClient.h"
#import "DataStore.h"

Migrasyon mula Objective-C patungong Swift — isang prosesong may yugto. Ang mga bagong file ay isinusulat sa Swift, ang mga luma ay unti-unting ni-refactor. Ang Bridging Header ay awtomatikong nabubuo kapag idinagdag ang unang Swift file sa isang Objective-C na proyekto. Para sa reverse visibility (ObjC → Swift), bumubuo ang Xcode ng file na -Swift.h na naglalaman ng @interface para sa mga Swift na klase na may markang @objc.

swift
// Swift class na nakikita mula sa Objective-C
@objc class SwiftRouter: NSObject {
    @objc func navigateToProfile(userId: Int) {
        // implementasyon
    }
}

Mga limitasyon: ang mga value-type ng Swift (struct, enum) ay hindi direktang nakikita mula sa Objective-C — kailangan silang balutin sa class na may @objc. Ang Generics sa Swift ay limitado ang access mula sa Objective-C. Inirerekomendang approach — isulat ang bagong code sa Swift, at i-refactor ang umiiral na Objective-C code lamang kapag nagbabago ang kaukulang functionality.

Runtime at method swizzling sa Objective-C

Pangunahing bentahe ng Objective-C kumpara sa Swift — buong access sa runtime. Ang method swizzling, pagpapalit ng implementasyon ng mga metodo sa panahon ng execution, ay nagpapahintulot ng pag-override ng mga system method walang mana. Ang mga library tulad ng Aspects at JRSwizzle ay gumagamit ng kakayahang ito para sa AOP (aspect-oriented programming) — pagmamanman, analytics at pag-log.

Forward invocation — isa pang kakayahan ng runtime: kung ang isang object ay hindi tumugon sa selector, tinatawag ng system ang forwardInvocation:, na nagpapahintulot ng pag-redirect ng mensahe sa ibang object. Ito ang batayan ng Proxy pattern sa Objective-C (NSProxy), na ginagamit para sa deferred initialization at distributed objects.

Inirerekomenda ng Apple na bawasan ang paggamit ng mga runtime trick sa bagong code, na mas pinipili ang static typing ng Swift. Gayunpaman, sa mga legacy na proyekto, kinakailangan ang kaalaman sa objc_msgSend, method_exchangeImplementations at objc_getAssociatedObject para sa pagpapanatili ng umiiral na codebase.

Property at Key-Value Observing

Sinusuportahan ng Objective-C ang property bilang syntactic sugar sa ibabaw ng ivar na may getter/setter. Ang mga modifier na atomic/nonatomic, strong/weak/copy, readonly/readwrite at assign/retain ay tumutukoy sa pag-uugali ng memorya at thread safety. Ang Key-Value Observing (KVO) — mekanismo ng pagmamasid sa mga pagbabago ng property na naka-embed sa runtime: anumang object ay maaaring mag-subscribe sa mga pagbabago ng property ng ibang object sa pamamagitan ng addObserver.

Mga Madalas Itanong

Ano ang syntax ng mensahe sa Objective-C?

Ang pagtawag ng metodo ay parang [object selector:argument]. Ang mensahe ay dumadaan sa objc_msgSend, na dynamic na nakakahanap ng implementasyon sa runtime. Ang selector ay pangalan ng metodo (@selector(methodName)), hindi pointer sa function. Ito ay nagpapahintulot ng swizzling at forward invocation.

Ano ang pagkakaiba ng mga kategorya (Categories) at ekstensyon (Extensions)?

Ang Category (@interface ClassName (Name)) ay nagdaragdag ng mga metodo sa anumang klase (kasama ang system) walang mana. Ang Extension (@interface ClassName ()) ay idineklara sa .m file at maaaring magdagdag ng property at ivar. Hindi maaaring magdagdag ng ivar ang Category, ang extension ay maaari.

Ano ang mga bloke (Blocks) sa Objective-C?

Blocks — mga anonymous na function na may syntax na ^(parameter) { katawan }, kumukuha ng mga variable mula sa konteksto. Katulad ng lambda sa C++ at closures sa Swift. Kinakailangan ang __weak para maiwasan ang retain cycles kapag kinukuha ang self. Ginagamit sa UIKit, GCD at Foundation.

Ano ang pagkakaiba ng ARC at MRC?

MRC — manu-manong pagbilang ng reference: ang programmer ay tumatawag ng retain, release, autorelease. ARC — awtomatiko: ang compiler ay naglalagay ng retain/release batay sa static analysis. Ang ARC ay hindi GC — ang mga object ay pinapalaya kaagad kapag naging zero ang counter. Sinusuportahan ng ARC ang __weak at __strong na modifier.

Maaari bang gamitin ang Objective-C at Swift sa iisang proyekto?

Oo, sa pamamagitan ng Bridging Header. Nakikita ng Swift ang Objective-C sa pamamagitan ng header na ito, nakikita ng Objective-C ang Swift sa pamamagitan ng -Swift.h. Ang mga Swift na klase ay dapat magmana mula sa NSObject at may markang @objc. Ang struct at enum mula sa Swift ay hindi direktang nakikita ng Objective-C.

Buod

  • Objective-C — mahigpit na superset ng C na may dynamic na runtime at syntax ng mensahe para sa Cocoa/Cocoa Touch
  • Message passing — mga tawag sa pamamagitan ng [object method] na may dynamic na pagpapadala sa pamamagitan ng objc_msgSend at posibilidad ng swizzling
  • Categories — pagdaragdag ng mga metodo sa umiiral na mga klase walang mana, kasama ang mga system class ng Apple
  • Blocks — mga anonymous na function na may closure, kinakailangan ang __weak para maiwasan ang retain cycles
  • ARC vs MRC — ebolusyon mula sa manu-manong retain/release patungo sa awtomatikong pagbilang ng reference sa pamamagitan ng compiler
  • Bridging Header — mekanismo ng pinagsamang paggamit ng Swift at Objective-C sa isang proyekto para sa unti-unting migrasyon
  • Kahalagahan ng legacy — humigit-kumulang 35% ng mga app sa App Store ay naglalaman ng Objective-C code na nangangailangan ng suporta

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din