@StateObject: یہ کیا ہے، ObservableObject کی تخلیق اور انتظام

مصنف: IT Sectr اشاعت: 2026-06-26 مطالعے کا وقت: 9 منٹ

@StateObject SwiftUI میں ایک property wrapper ہے جو View کی پوری زندگی کے دوران ObservableObject کی ایک مثال بناتا اور اس کا مالک ہوتا ہے۔ جب View پہلی بار اسکرین پر ظاہر ہوتی ہے، @StateObject آبجیکٹ کو ابتدائیہ دیتا ہے اور اسے اس وقت تک ذخیرہ کرتا ہے جب تک View میموری سے ہٹا نہیں دی جاتی۔ یہ یقینی بناتا ہے کہ انٹرفیس کی دوبارہ تعمیر پر ڈیٹا ری سیٹ نہ ہو — مثال کے طور پر، تھیم تبدیل کرنے یا والدین View کو اپ ڈیٹ کرنے پر۔ Apple ڈویلپر دستاویزات (2025) کے مطابق، @StateObject کو SwiftUI کے درجہ بندی میں ObservableObject کے لیے بنیادی ماخذ حقیقت (source of truth) کے طور پر استعمال کیا جانا چاہیے، جبکہ ذیلی Views @ObservedObject یا @EnvironmentObject کے ذریعے پہلے سے بنایا گیا آبجیکٹ وصول کرتی ہیں۔

اہم نکات

  • @StateObject — View کے اندر ObservableObject بنانے اور اس کی ملکیت رکھنے کے لیے property wrapper۔
  • ایک بار تخلیق — آبجیکٹ View کی زندگی میں ایک بار ابتدائیہ پاتا ہے اور دوبارہ تعمیر پر دوبارہ نہیں بنتا۔
  • ماخذ حقیقت — @ObservedObject کے برعکس، @StateObject درجہ بندی میں ماخذ حقیقت ہے۔
  • زندگی کا چکر — آبجیکٹ اس وقت تک زندہ رہتا ہے جب تک View میموری میں موجود ہے، اور اس کے ساتھ تباہ ہو جاتا ہے۔
  • ابتدائیہ — @StateObject کو تخلیق پر ابتدائی قدر کی ضرورت ہوتی ہے، عام طور پر پیرامیٹرز کے ساتھ init کے ذریعے۔

SwiftUI میں @StateObject کیا ہے

@StateObject ایک property wrapper ہے جو iOS 14 میں متعارف کرایا گیا، جو View کو ObservableObject پروٹوکول کی تعمیل کرنے والی کلاس کی مثال بنانے اور اس کی ملکیت رکھنے کی اجازت دیتا ہے۔ @State کے برعکس، جو قدر کی اقسام (structs) کے ساتھ کام کرتا ہے، @StateObject حوالہ جاتی اقسام — وہ کلاسیں جو SwiftUI کو اپنی خصوصیات میں تبدیلیوں کے بارے میں مطلع کر سکتی ہیں — کے لیے ڈیزائن کیا گیا ہے۔

جب کوئی View @StateObject var viewModel: MyViewModel استعمال کرتی ہے، SwiftUI خود بخود View کے پہلی بار ظاہر ہونے پر MyViewModel کی ایک مثال بناتا ہے اور اسے فریم ورک کے ایک خاص ذخیرہ میں محفوظ کرتا ہے۔ ہر View اپ ڈیٹ پر (مثال کے طور پر، جب والدین کی حالت بدلتی ہے)، SwiftUI آبجیکٹ کو دوبارہ نہیں بناتا — وہ موجودہ مثال اس وقت تک استعمال کرتا ہے جب تک View درجہ بندی سے ہٹا نہیں دی جاتی۔

Apple WWDC Session 10137 (2024) کے مطابق، @StateObject iOS 13 میں موجود ڈیٹا کے نقصان کے مسئلے کو حل کرتا ہے جب Views دوبارہ تعمیر ہوتی تھیں، جس سے ڈویلپرز کو والدین View میں ObservableObject بنانے اور اسے ابتدائیہ دینے والے کے ذریعے منتقل کرنے پر مجبور ہونا پڑتا تھا۔ اس سے کوڈ کی نقل اور غلطی سے آبجیکٹ کے دوبارہ بننے کا خطرہ تھا۔

swift
import SwiftUI

class CounterViewModel: ObservableObject {
    @Published var count: Int = 0
    
    func increment() {
        count += 1
    }
}

struct CounterView: View {
    @StateObject var viewModel = CounterViewModel()
    
    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
            Button("Increment", action: viewModel.increment)
        }
    }
}

@StateObject کیسے کام کرتا ہے

@StateObject کا طریقہ کار SwiftUI کے Combine فریم ورک کے ساتھ انضمام پر مبنی ہے۔ جب ObservableObject اپنی خصوصیات کو @Published وصف سے نشان زد کرتا ہے، SwiftUI خود بخود ObservableObject پروٹوکول میں موجود پبلشر کے ذریعے تبدیلیوں کو سبسکرائب کرتا ہے۔ جب کوئی شائع شدہ خصوصیت بدلتی ہے، آبجیکٹ objectWillChange پبلشر کے ذریعے سگنل بھیجتا ہے، جو اس آبجیکٹ کو دیکھنے والی تمام Views کی دوبارہ ڈرائنگ کو متحرک کرتا ہے۔

SwiftUI ObservableObject مثال کو ایک خاص View مثال سے منسلک ایک خاص ذخیرہ میں محفوظ کرتا ہے۔ یہ ذخیرہ پہلی رینڈرنگ کے دوران ایک بار بنتا ہے اور View کے تباہ ہونے تک موجود رہتا ہے۔ یہی وجہ ہے کہ @StateObject حوالہ کے استحکام کی ضمانت دیتا ہے — SwiftUI میموری کو خود بخود منظم کرتا ہے، View کے ابتدائیہ دینے والے پر انحصار کیے بغیر۔

objc.io — Thinking in SwiftUI (2025) کے مطابق، @StateObject کا اندرونی نفاذ @State جیسا طریقہ کار استعمال کرتا ہے لیکن حوالہ جاتی اقسام کے لیے: SwiftUI آبجیکٹ کے گرد ایک باکسنگ ریپر بناتا ہے اور اپنے مختص کنندہ کے ذریعے اس کی زندگی کا چکر منظم کرتا ہے، جو بار بار View درجہ بندی کی دوبارہ تعمیر کے لیے بہتر بنایا گیا ہے۔

@StateObject کا زندگی کا چکر

  • تخلیق — جب View پہلی بار اسکرین پر ظاہر ہوتی ہے، SwiftUI آبجیکٹ کے ابتدائیہ دینے والے کو کال کرتا ہے اور حوالہ محفوظ کرتا ہے۔
  • دوبارہ تعمیر — جب والدین View اپ ڈیٹ ہوتا ہے، آبجیکٹ دوبارہ نہیں بنتا؛ موجودہ مثال استعمال ہوتی ہے۔
  • تباہی — جب View اسکرین چھوڑتی ہے اور درجہ بندی سے ہٹا دی جاتی ہے، SwiftUI آبجیکٹ کا deinit کال کرتا ہے۔

@StateObject بمقابلہ @ObservedObject: کلیدی فرق

@StateObject اور @ObservedObject کے درمیان بنیادی فرق یہ ہے کہ آبجیکٹ کا مالک کون ہے۔ @StateObject آبجیکٹ بناتا اور محفوظ کرتا ہے — وہ مالک ہے۔ @ObservedObject صرف اس آبجیکٹ کو دیکھتا ہے جو کہیں اور بنایا گیا اور ابتدائیہ دینے والے یا خصوصیت کے ذریعے منتقل کیا گیا۔

خصوصیت@StateObject@ObservedObject
ملکیتآبجیکٹ بناتا اور اس کا مالک ہےصرف دیکھتا ہے
ابتدائیہView کے اندر init/ڈیفالٹ کے ذریعےبیرونی، پیرامیٹر کے ذریعے منتقل
زندگی کا چکرView کے زندگی کے چکر سے منسلکView کے ذریعے کنٹرول نہیں ہوتا
دوبارہ تخلیقاپ ڈیٹ پر دوبارہ نہیں بنتابیرونی طور پر تبدیل کیا جا سکتا ہے
iOS ورژنiOS 14+iOS 13+

قاعدہ آسان ہے: اگر View ObservableObject بناتی ہے — @StateObject استعمال کریں۔ اگر View صرف والدین سے پہلے سے بنا ہوا آبجیکٹ وصول کرتی ہے — @ObservedObject استعمال کریں۔ اس قاعدے کی خلاف ورزی یا تو ڈیٹا کے نقصان (اگر ملکیت کے لیے @ObservedObject استعمال کیا جائے) یا ضرورت سے زیادہ آبجیکٹ تخلیق (اگر مشاہدے کے لیے @StateObject استعمال کیا جائے) کا باعث بنتی ہے۔

@StateObject کب استعمال کریں

@StateObject کو ان Views میں استعمال کیا جانا چاہیے جو ڈیٹا کے مخصوص سیٹ کے لیے ماخذ حقیقت ہیں۔ عام منظرناموں میں اپنے view model والی اسکرینیں، نیویگیشن اسٹیک کی جڑی اسکرینیں، اور موڈل پریزنٹیشنز شامل ہیں جو اپنی حالت خود منظم کرتی ہیں۔

  • View model والی اسکرین — ہر اسکرین جو اپنے ڈیٹا اور منطق کو منظم کرتی ہے، @StateObject کے ذریعے اپنا view model بنانا چاہیے۔
  • جڑ View — NavigationStack یا TabView کے درجہ بندی میں، جڑ عنصر ڈیٹا بناتا ہے، اور ذیلی عناصر @ObservedObject کے ذریعے ڈیٹا وصول کرتے ہیں۔
  • موڈل ونڈوز — .sheet اور .fullScreenCover کو اکثر فارم یا عمل کو منظم کرنے کے لیے اپنے @StateObject کی ضرورت ہوتی ہے۔
  • قابل تدوین فہرست — فہرست کی ہر قطار جس میں تدوین فارم ہے، اس کا اپنا @StateObject ہونا چاہیے۔
swift
struct ProfileView: View {
    @StateObject var viewModel = ProfileViewModel()
    
    var body: some View {
        NavigationStack {
            Form {
                TextField("Name", text: $viewModel.name)
                TextField("Email", text: $viewModel.email)
                Button("Save") {
                    viewModel.saveProfile()
                }
            }
            .navigationTitle("Profile")
        }
    }
}

پیرامیٹرز کے ساتھ @StateObject کو ابتدائیہ دینا

@StateObject کو پیرامیٹرز کے ساتھ ابتدائیہ دینے کے لیے خاص نحو درکار ہے، کیونکہ SwiftUI آبجیکٹ کی تخلیق خود منظم کرتا ہے۔ آپ ابتدائیہ دینے والے میں صرف پیرامیٹرز منتقل نہیں کر سکتے — آپ کو ایک فرار ہونے والا closure یا علیحدہ فیکٹری طریقہ استعمال کرنا ہوگا۔

Swift by Sundell (2024) کے مطابق، سب سے صاف طریقہ فیکٹری طریقہ یا closure استعمال کرنا ہے جسے SwiftUI آبجیکٹ کی پہلی تخلیق پر کال کرے گا۔ ایک متبادل طریقہ ObservableObject کو والدین View میں ابتدائیہ دینا اور معیاری ابتدائیہ دینے والے کا استعمال کرتے ہوئے @StateObject کے ذریعے منتقل کرنا ہے۔

swift
class UserViewModel: ObservableObject {
    @Published var user: User
    
    init(user: User) {
        self.user = user
    }
}

struct UserDetailView: View {
    @StateObject var viewModel: UserViewModel
    
    init(user: User) {
        _viewModel = StateObject(wrappedValue: UserViewModel(user: user))
    }
    
    var body: some View {
        Text(viewModel.user.name)
    }
}

یہ یاد رکھنا ضروری ہے کہ @StateObject کے ساتھ View ابتدائیہ دینے والا property wrapper تک رسائی کے لیے خصوصیت کے نام سے پہلے زیرخط (_viewModel) استعمال کرنا چاہیے، نہ کہ اس کی قدر۔ یہ ابتدائیہ دینے والوں میں property wrappers کے ساتھ کام کرنے کے لیے ایک معیاری Swift نمونہ ہے۔

@StateObject کے ساتھ عام غلطیاں

سب سے عام غلطی اس View کے لیے جسے آبجیکٹ کا مالک ہونا چاہیے، @StateObject کے بجائے @ObservedObject استعمال کرنا ہے۔ اس صورت میں، ہر بار جب والدین دوبارہ تعمیر ہوتا ہے، آبجیکٹ دوبارہ بنایا جائے گا، جس سے تمام جمع شدہ ڈیٹا ضائع ہو جائے گا۔ یہ غلطی NavigationStack یا TabView کے ساتھ پیچیدہ درجہ بندیوں میں خاص طور پر خطرناک ہے۔

  • نیویگیشن کے دوران ڈیٹا کا نقصان — اگر کوئی ذیلی اسکرین اپنے view model کے لیے @ObservedObject استعمال کرتی ہے، تو پیچھے جانے اور دوبارہ کھولنے پر ڈیٹا ری سیٹ ہو جائے گا۔
  • میموری لیک — والدین View میں @StateObject بنانا جو کبھی نہیں ہٹتا، آبجیکٹ جمع ہونے کا باعث بن سکتا ہے اگر ہر ذیلی اسکرین بھی بغیر کنٹرول کے @StateObject بنائے۔
  • آبجیکٹ کی نقل — ایک ObservableObject کو مختلف Views میں متعدد @StateObject میں منتقل کرنے سے کئی آزاد مثالیں بنتی ہیں جو ایک دوسرے کے ساتھ ہم آہنگ نہیں ہوتیں۔

ان مسائل سے بچنے کے لیے، ایک سادہ قاعدہ پر عمل کریں: فی ماخذ حقیقت ایک @StateObject۔ اگر ڈیٹا کو متعدد اسکرینوں میں مشترکہ ہونا چاہیے — جڑ View میں ایک بار @StateObject بنائیں اور @ObservedObject یا @EnvironmentObject کے ذریعے ذیلی عناصر کو منتقل کریں۔

swift
// ❌ Wrong: @ObservedObject for owning an object
struct BadView: View {
    @ObservedObject var vm = ViewModel() // will be recreated on each update!
}

// ✅ Correct: @StateObject for owning
struct GoodView: View {
    @StateObject var vm = ViewModel() // created once for View lifetime
}

اکثر پوچھے گئے سوالات

@StateObject اور @State میں کیا فرق ہے؟

@State قدر کی اقسام (structs، سٹرنگز، اعداد) کے ساتھ کام کرتا ہے اور قدر کو براہ راست SwiftUI ذخیرہ میں محفوظ کرتا ہے۔ @StateObject حوالہ جاتی اقسام — ObservableObject کی تعمیل کرنے والی کلاسوں کے ساتھ کام کرتا ہے۔ @State سادہ مقامی حالتوں کے لیے موزوں ہے، @StateObject منطق اور شائع شدہ خصوصیات والے پیچیدہ آبجیکٹ کے لیے۔

کیا میں iOS 13 میں @StateObject استعمال کر سکتا ہوں؟

نہیں، @StateObject صرف iOS 14 اور اس سے اوپر دستیاب ہے۔ iOS 13 کے لیے، @ObservedObject استعمال کریں اور دستی زندگی کے چکر کے انتظام کے ساتھ @State کے ذریعے والدین View میں ObservableObject بنائیں۔ ایک متبادل ان ڈیٹا کے لیے جو حوالہ جاتی معنویات کی ضرورت نہیں رکھتے، class کی بجائے struct کے ساتھ @State استعمال کرنا ہے۔

اگر میں ذیلی View میں @StateObject استعمال کروں جہاں آبجیکٹ والدین سے منتقل ہوتا ہے تو کیا ہوتا ہے؟

ذیلی View ObservableObject کی اپنی کاپی بنائے گی، جو والدین سے مکمل طور پر آزاد ہوگی۔ ایک میں تبدیلیاں دوسرے کو متاثر نہیں کریں گی۔ یہ تقریباً ہمیشہ ایک غلطی ہے: والدین سے آبجیکٹ وصول کرنے کے لیے @ObservedObject استعمال کریں اور View کے اندر نیا آبجیکٹ بنانے کے لیے صرف @StateObject استعمال کریں۔

@StateObject کے ذریعے بنایا گیا آبجیکٹ کب تباہ ہوتا ہے؟

آبجیکٹ اس وقت تباہ ہوتا ہے جب اسے بنانے والی View مکمل طور پر SwiftUI درجہ بندی سے ہٹا دی جاتی ہے۔ NavigationStack میں اسکرین کے لیے، یہ نیویگیشن اسٹیک سے پاپ ہونے پر ہوتا ہے۔ موڈل ونڈو کے لیے — جب اسے بند کیا جاتا ہے۔ TabView کے لیے — ٹیب تبدیل کرنے پر، اگر View کیش نہ کی گئی ہو۔

ابتدائیہ دیتے وقت @StateObject میں پیرامیٹرز کیسے منتقل کریں؟

زیرخط کے ذریعے property wrapper تک رسائی کے ساتھ ایک حسب ضرورت init استعمال کریں: _viewModel = StateObject(wrappedValue: MyViewModel(param: value))۔ یہ نمونہ View کی زندگی میں ایک بار آبجیکٹ بنانے کی ضمانت برقرار رکھتے ہوئے ObservableObject میں کوئی بھی پیرامیٹر منتقل کرنے کی اجازت دیتا ہے۔

خلاصہ

  • @StateObject — View کے اندر ObservableObject بنانے اور اس کی ملکیت رکھنے کے لیے property wrapper، iOS 14 سے دستیاب۔
  • واحد تخلیق کی ضمانت — آبجیکٹ ایک بار ابتدائیہ پاتا ہے اور View کی دوبارہ تعمیر پر دوبارہ نہیں بنتا۔
  • ماخذ حقیقت — @StateObject ماخذ حقیقت ہے، جبکہ @ObservedObject صرف ایک نگران ہے۔
  • زندگی کا چکر — آبجیکٹ اس وقت تک زندہ رہتا ہے جب تک View SwiftUI درجہ بندی میں موجود ہے، اور اسے چھوڑنے پر تباہ ہو جاتا ہے۔
  • پیرامیٹرز کے ساتھ ابتدائیہ — _viewModel اور StateObject(wrappedValue:) کے ذریعے property wrapper تک رسائی درکار ہے۔
  • ملکیت کی غلطی — آبجیکٹ بنانے کے لیے @ObservedObject استعمال کرنے سے دوبارہ تعمیر پر ڈیٹا ضائع ہوتا ہے۔
  • ایک آبجیکٹ — ایک @StateObject — مشترکہ ڈیٹا کے لیے، جڑ View میں @StateObject بنائیں اور @ObservedObject کے ذریعے ذیلی عناصر کو منتقل کریں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں