iOS Runtime, Method Swizzling, Hot Reload, Tree Shaking, Webpack — bu terimlerin arkasında, uygulamanın cihazda nasıl çalıştığını, nasıl derlendiğini ve optimize edildiğini belirleyen anahtar mekanizmalar vardır. JetBrains Developer Ecosystem 2025'e göre, geliştiricilerin %78'i günlük olarak derleme araçları (Webpack, Metro, Vite) kullanmaktadır. Runtime, Reflection, derleme araçları ve kod optimizasyonlarını inceleyelim.
Önemli Noktalar
Runtime (çalışma ortamı), uygulama yürütmesini yöneten yazılımdır. iOS Runtime bağlamında, nesnelere mesaj göndermeye, anında sınıflar oluşturmaya ve çalışma zamanında yöntemleri değiştirmeye olanak tanıyan Objective-C'nin dinamik sistemidir. Bu mümkündür çünkü Objective-C, C üzerine inşa edilmiş dinamik olarak tiplendirilmiş bir dildir.
Reflection, bir programın kendi yapısını çalışma zamanında inceleme ve değiştirme yeteneğidir. iOS Runtime'da bu, class_getInstanceMethod, method_exchangeImplementations ve objc_getAssociatedObject gibi işlevler aracılığıyla uygulanır. Kotlin/Java'da yansıma, KClass / java.lang.reflect kullanır.
IT Sectr'de, Runtime'ı çok nadiren kullanırız — yalnızca alternatifi olmayan belirli görevler için. Örneğin, merkezi analitik günlüğü veya kütüphanelerdeki hataları düzeltmek için Method Swizzling. Ancak Runtime, derin anlayış ve dikkat gerektiren güçlü bir araçtır.
Method Swizzling, çalışma zamanında bir Objective-C yöntemi uygulamasını başka bir yöntemle değiştirme tekniğidir. Bu, iOS için Aspect-Oriented Programming (AOP) özel bir durumudur. Swizzling, mevcut yöntemlerin kaynak kodunu değiştirmeden günlükleme, analitik veya önbellekleme eklemeye olanak tanır.
Tipik bir örnek: otomatik ekran günlüğü eklemek için UIViewController'da viewWillAppear:'ı değiştirme. Önemli: swizzling, +load veya +initialize yönteminde yapılmalıdır, böylece sınıf kullanılmadan önce yürütülmesi garanti edilir. Yanlış swizzling, tanımsız davranışa ve hata ayıklaması zor hatalara neden olabilir.
// Method Swizzling for logging viewWillAppear:
@implementation UIViewController (Tracking)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(viewWillAppear:);
SEL swizzledSelector = @selector(xxx_viewWillAppear:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
});
}
- (void)xxx_viewWillAppear:(BOOL)animated {
[self xxx_viewWillAppear:animated]; // orijinal yöntemi çağırma
[Analytics logScreen:NSStringFromClass([self class])];
}
@end
Bu kod, swizzling aracılığıyla tüm UIViewController'da viewWillAppear:'ı değiştirir. method_exchangeImplementations sonrasında, orijinal viewWillAppear:'ı çağırmak, orijinal yöntemi çağıran (özyinelemeli çağrı yoluyla) ve analitik ekleyen xxx_viewWillAppear:'ın çağrılmasına yol açar. DispatchOnce, swizzling'in tek seferlik yürütülmesini garanti eder.
Modern web geliştirme ve React Native veya Flutter ile mobil geliştirme, derleme araçları olmadan imkansızdır. Transpilation, kodun bir dilden diğerine dönüştürülmesidir. En popüler örnek: TypeScript → JavaScript. Bir dönüştürücü (Babel, tsc) modern kodu geriye dönük uyumlu bir sürüme dönüştürür.
Polyfill, eski tarayıcılara eksik işlevsellik ekleyen koddur. Örneğin, Promise.allSettled() Internet Explorer'da çalışmaz, ancak bir polyfill bu yeteneği ekler. Yerel Runtime'ın kodu doğrudan cihazda yönetmesinin aksine, polyfill'ler ve dönüştürücüler dil soyutlama seviyesinde çalışır — sözdizimini ve API'leri uyarlar ancak çalışma ortamına müdahale etmezler.
Webpack en popüler paketleyicidir (State of JS 2024'e göre projelerin %72'sinde kullanılır). Metro, React Native'de varsayılan olarak kullanılan Facebook'un paketleyicisidir. JavaScript'te Reflection, Object.getPrototypeOf, Proxy ve Reflect API aracılığıyla bulunur — bu mekanizmalar, çalışma zamanında nesneleri incelemeye ve değiştirmeye olanak tanır, bu da paketleyicilerdeki statik modül analizinden temel olarak farklıdır. Webpack, giriş noktasını, çıktıyı, yükleyicileri (farklı dosya türlerini işlemek için) ve eklentileri (ek işlevsellik için) tanımlayan bir yapılandırma dosyası kullanır.
// webpack.config.js — minimum yapılandırma
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader',
},
],
},
mode: 'production',
};
Bu yapılandırma, giriş noktasını (index.js), çıktı dosyasını (bundle.js) ve Babel aracılığıyla JavaScript işleme kuralını tanımlar. production modu, optimizasyonları (küçültme, tree shaking ve otomatik ortam algılama) etkinleştirir. Runtime aşamasında, tüm bu optimizasyonlar mantığı etkilemez — tarayıcı, küçültülmüş paketi normal JavaScript olarak çalıştırır.
Minification, boşlukları ve yorumları kaldırarak ve uzun değişkenleri kısa olanlarla yeniden adlandırarak kodu sıkıştırma işlemidir. Popüler küçültücüler: Terser (JS/TS), CSSNano (CSS), html-minifier-terser. Küçültme, dosya boyutunu %50–70 oranında azaltır. Üretimde, Runtime küçültülmüş kodu orijinal kodla aynı şekilde çalıştırır — fark yalnızca okunabilirlik ve dosya boyutundadır, anlambilimde değil.
Tree Shaking, uygulamada kullanılmayan ölü kodun kaldırılmasıdır. ES modüllerinin (import/export) statik analizine dayanarak çalışır. Bir işlev dışa aktarılıyor ancak hiç içe aktarılmıyorsa, Tree Shaking onu son derlemeden kaldırır. Tree Shaking, kodu statik olarak analiz eder — dinamik olarak çalışan ve derleme zamanında görünmeyen yöntemlere ve özelliklere erişebilen Reflection'ın aksine.
Tree Shaking, Webpack'te üretim modunda otomatik olarak etkinleştirilir. Önemli bir koşul: kod ES modülleri (import/export) kullanmalıdır, CommonJS (require) kullanmamalıdır. Bir kütüphane CommonJS ile yazılmışsa, tree shaking çalışmaz. Optimum tree shaking için, import _ from 'lodash' yerine import { merge } from 'lodash-es' gibi hassas içe aktarımlar kullanın. Bu, tek bir işlev için paket boyutunu 500 KB'den 10 KB'ye düşürür.
Hot Reload, uygulama kodunu tamamen yeniden yüklemeden güncellemeye olanak tanıyan bir teknolojidir. React Native ve Flutter'da, Hot Reload, değiştirilen dosyayı anında günceller, mevcut uygulama durumunu korur. Bu, geliştirmeyi kökten hızlandırır: değişiklikler, tam yeniden derleme için 10–30 saniye yerine 1–2 saniyede görünür. Hot Reload, Runtime içinde çalışır: değiştirilen modül, çalışma ortamını yeniden başlatmadan çalışan uygulamaya enjekte edilir.
Hot Restart, güncellenmiş kodla uygulamanın hızlı bir şekilde yeniden başlatılmasıdır, ancak durum korunmaz. Hot Reload mümkün olmadığında kullanılır (örneğin, yerel kod veya genel değişkenler değiştiğinde). IT Sectr'de, UI geliştirmenin tüm aşamalarında Hot Reload kullanırız — görsel ayarlamalarda %50'ye kadar zaman tasarrufu sağlar.
| Araç | Amaç | Platform |
|---|---|---|
| Webpack | Zengin eklenti ekosistemine sahip evrensel paketleyici | Web, React Native (özel) |
| Metro | React Native için Facebook'un paketleyicisi | React Native (varsayılan) |
| Vite | Web için ESBuild tabanlı hızlı paketleyici | Web (React, Vue, Svelte) |
| esbuild | Go tabanlı ultra hızlı paketleyici (Webpack'ten 10-100x daha hızlı) | Web, Node.js |
| Rollup | Kütüphaneler için paketleyici (ES modülleri, tree shaking) | Kütüphaneler, NPM paketleri |
Tablo 3. Derleme araçlarının karşılaştırması. Webpack evrensel standarttır. Metro, React Native için uzmanlaşmıştır. Vite ve esbuild, hıza odaklanan yeni nesildir. Rollup, kütüphane yayınlamak için en iyi seçimdir.
Hot Reload, web geliştirmede (React Hot Loader, HMR — Hot Module Replacement) ortaya çıkmış ve Flutter ve React Native ile mobil geliştirmeye geçmiş bir teknolojidir. Öz: bir dosya değiştiğinde, paketleyici güncellenmiş modülü çalışan uygulamaya gönderir, bu da durumu kaybetmeden eski kodu değiştirir. Tam yeniden derlemenin aksine, Hot Reload Runtime'ı yeniden başlatmaz — çalışma ortamı çalışmaya devam eder ve değiştirilen modül, HMR veya Reflection benzeri bir referans güncellemesi gibi bir mekanizma aracılığıyla dinamik olarak bağlanır.
Hot Reload çalışır çünkü çerçeve, widget'ları (Flutter) veya bileşenleri (React) bellekte tutar ve yalnızca değiştirilen kısımları günceller. Hot Restart daha kaba bir mekanizmadır: uygulamayı tamamen yeniden başlatır, ancak yerel kodu yeniden derlemediği için tam yeniden derlemeden daha hızlıdır. IT Sectr'de, UI geliştirirken Hot Reload, gezinme veya durum yönetimini değiştirirken Hot Restart kullanırız.
Sıkça Sorulan Sorular
Method Swizzling, çalışma zamanında bir yöntem uygulamasının değiştirilmesidir. AOP (Aspect-Oriented Programming) için kullanılır: otomatik günlükleme, analitik, kütüphanelerdeki hata düzeltmeleri. Dikkatli kullanılmalıdır — yanlış swizzling tanımsız davranışa neden olabilir.
Runtime (çalışma ortamı), kod yürütmesini yöneten altyapıdır: bellek ayırma, yöntem dağıtımı, çöp toplama. Reflection, Runtime içinde bir programın çalışma zamanında kendi yapısını (sınıflar, yöntemler, özellikler) incelemesine ve değiştirmesine olanak tanıyan belirli bir mekanizmadır. Runtime daha geniştir, Reflection onun araçlarından biridir.
Hot Reload, uygulama durumunu kaybetmeden kodu günceller — değişiklikleri anında görürsünüz. Hot Restart uygulamayı yeniden başlatır (durum kaybedilir), ancak tam yeniden derlemeden daha hızlıdır. Hot Reload UI değişiklikleri için kullanılır, Hot Restart — mantık ve gezinme değişiklikleri için.
Tree Shaking, son derlemeden kullanılmayan kodun kaldırılmasıdır. ES modüllerinin (import/export) statik analizi yoluyla çalışır. Webpack, üretim modunda Tree Shaking'i otomatik olarak etkinleştirir. Maksimum verimlilik için, tüm kütüphaneyi içe aktarmak yerine hassas içe aktarımlar kullanın.
Web projesi için — Vite (en hızlı, modern). React Native için — Metro (varsayılan). Kütüphaneler için — Rollup. Çok sayıda eklenti ve eski kodla uyumluluk gerekiyorsa — Webpack. Ultra hızlı derleme için — esbuild.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.