Unowned Reference: यह क्या है, सिंटैक्स और मोबाइल एप्लिकेशन में उपयोग

लेखक: IT Sectr प्रकाशित: 2026-03-30 पढ़ने का समय: 9 मिनट

Unowned Reference (अस्वामित्व संदर्भ) Swift में एक गैर-मालिकाना संदर्भ है जो ऑब्जेक्ट के retain count को नहीं बढ़ाता है और weak के विपरीत, ऑब्जेक्ट के मुक्त होने के बाद nil पर सेट नहीं होता है। Apple Swift Language Guide, 2026 के अनुसार, unowned का उपयोग तब किया जाता है जब गारंटी हो कि ऑब्जेक्ट कम से कम उतने समय तक जीवित रहता है जितने समय तक उसे संदर्भित करने वाला ऑब्जेक्ट। Weak Reference के विपरीत, unowned को unwrap की आवश्यकता नहीं होती — यह एक गैर-वैकल्पिक प्रकार है, जो कोड को साफ़ बनाता है लेकिन जीवनकाल की गारंटी की जिम्मेदारी डेवलपर पर डालता है।

मुख्य बिंदु

  • Unowned Reference — स्वचालित शून्यीकरण के बिना गैर-मालिकाना संदर्भ; गैर-वैकल्पिक, retain count नहीं बढ़ाता
  • गारंटी — उपयोग तब किया जाता है जब ऑब्जेक्ट संदर्भित करने वाले ऑब्जेक्ट से पहले मुक्त नहीं हो सकता
  • Weak से अंतर — unowned nil-शून्यीकृत नहीं होता (क्रैश जोखिम), weak शून्यीकृत होता है (सुरक्षित)
  • परिदृश्य — जीवनकाल गारंटी के साथ पैरेंट-चाइल्ड, unowned self के साथ क्लोज़र्स, सिंगलटन और Service Locator
  • जोखिम — मुक्त किए गए unowned ऑब्जेक्ट तक पहुँच रनटाइम क्रैश (EXC_BAD_ACCESS) का कारण बनती है

Unowned Reference क्या है?

Unowned Reference ARC में एक ऑब्जेक्ट का गैर-मालिकाना संदर्भ है जो उसके retain count को नहीं बढ़ाता है। weak के विपरीत, unowned संदर्भ ऑब्जेक्ट के डीलोकेशन के बाद शून्यीकृत नहीं होता: यह उस मेमोरी की ओर इशारा करता रहता है जो पहले ही मुक्त हो चुकी है। ऐसे संदर्भ तक पहुँच EXC_BAD_ACCESS के साथ रनटाइम क्रैश का कारण बनती है।

“अस्वामित्व” शब्द शब्दार्थ को दर्शाता है: ऑब्जेक्ट मौजूद है, लेकिन कोई भी उसके जीवनकाल के लिए जिम्मेदार नहीं है। डेवलपर स्पष्ट रूप से घोषित करता है: “मैं गारंटी देता हूँ कि यह ऑब्जेक्ट तब तक जीवित रहेगा जब तक मैं इसे संदर्भित करता हूँ।” कंपाइलर इस गारंटी की पुष्टि नहीं करता — यह डेवलपर स्तर पर एक अनुबंध है।

Swift.org Documentation, 2026 के अनुसार, गारंटीकृत जीवनकाल वाले परिदृश्यों में unowned संदर्भ weak से बेहतर होते हैं क्योंकि वे: वैकल्पिक प्रकार की आवश्यकता नहीं होती (साफ़ कोड), unwrap की आवश्यकता नहीं होती (कम force-unwrap या guard let), और शून्यीकरण weak तालिका के रखरखाव का कोई ओवरहेड नहीं होता। हालाँकि, अनुबंध का कोई भी उल्लंघन क्रैश में परिणत होता है।

Swift में unowned सिंटैक्स

Swift में, unowned संदर्भ let या var से पहले कीवर्ड unowned के साथ घोषित किए जाते हैं। weak के विपरीत, unowned दोनों let और var हो सकता है, और वैकल्पिक प्रकार की आवश्यकता नहीं होती। यह गुण unowned को उन संदर्भों के लिए सुविधाजनक बनाता है जो डोमेन तर्क द्वारा nil नहीं हो सकते।

swift
class Country {
    let name: String
    var capital: City!           // आरंभीकरण के बाद सेट किया जाएगा
    init(name: String) { self.name = name }
}

class City {
    let name: String
    unowned let country: Country   // ✅ unowned let — जीवनकाल गारंटी

    init(name: String, country: Country) {
        self.name = name
        self.country = country
    }
}

// उपयोग
let france = Country(name: "France")
let paris = City(name: "Paris", country: france)
france.capital = paris
// ✅ Country → City (strong), City → Country (unowned) — कोई retain cycle नहीं

इस उदाहरण में, City unowned let country — एक शहर बिना देश के अस्तित्व में नहीं रह सकता। यदि देश गायब हो जाता है, तो शहर (और संदर्भ) अपना अर्थ खो देते हैं। शब्दार्थ की दृष्टि से, यह unowned के लिए एक आदर्श मामला है: जीवनकाल गारंटी मौजूद है, वैकल्पिक की आवश्यकता नहीं, retain cycle उत्पन्न नहीं होता।

unowned var

unowned var अनुमत है लेकिन कम आम है। इसका उपयोग तब किया जाता है जब संदर्भ को बदला जा सकता है (उदाहरण के लिए, किसी बच्चे को दूसरे माता-पिता से पुनः जोड़ना)। पुनः असाइनमेंट पर, पुराने ऑब्जेक्ट का डीलोकेशन बाहरी मालिक की जिम्मेदारी है।

Unowned Optional

Swift 5.0+ में, unowned वैकल्पिक (unowned let x: Type?) के लिए समर्थन पेश किया गया। यह एक समझौता है: unowned गारंटी देता है कि यदि संदर्भ nil नहीं है, तो ऑब्जेक्ट जीवित है। डीलोकेशन पर व्यवहार क्रैश है, जैसा कि सामान्य unowned के साथ होता है।

Unowned vs Weak: कब क्या उपयोग करें

unowned और weak के बीच चुनाव Swift आर्किटेक्चर डिज़ाइन करते समय लगातार लिए जाने वाले निर्णयों में से एक है। आइए प्रत्येक मामले के मानदंड और अनुशंसाएँ देखें।

मानदंडWeakUnowned
वैकल्पिकहाँ (Type?)नहीं (Type)
डीलोकेशन पर शून्यीकरणस्वतः nil परनहीं (लटकता पॉइंटर जोखिम)
प्रकार (let/var)केवल varlet या var
प्रदर्शनweak तालिका का ओवरहेडन्यूनतम (सरल पॉइंटर)
सुरक्षासुरक्षित (nil जाँचा जाता है)EXC_BAD_ACCESS का जोखिम
जीवनकाल गारंटीआवश्यक नहींस्पष्ट गारंटी आवश्यक

व्यावहारिक नियम

weak का उपयोग करें यदि ऑब्जेक्ट के जीवनकाल के बारे में थोड़ा भी संदेह हो। Weak सुरक्षित, स्पष्ट है और इसमें प्रमाण की आवश्यकता नहीं है। unowned का उपयोग करें केवल तब जब आप उन सभी परिदृश्यों को खारिज कर सकें जिनमें ऑब्जेक्ट पहले मुक्त हो सकता है। विशिष्ट मामले: बच्चा जो माता-पिता के बिना मौजूद नहीं है; क्लोज़र जो समकालिक रूप से निष्पादित होता है; अपने आरंभकर्ता के भीतर ऑब्जेक्ट तक पहुँच।

Airbnb Swift Style Guide, 2025 के अनुसार, बड़े कोडबेस में डिफ़ॉल्ट रूप से weak का उपयोग करने की अनुशंसा की जाती है और unowned केवल स्पष्ट टिप्पणी के साथ जो जीवनकाल गारंटी की व्याख्या करती हो। यह रिफैक्टरिंग के दौरान गैर-स्पष्ट क्रैश के जोखिम को कम करता है।

क्लोज़र्स में Unowned self

क्लोज़र्स पैरेंट-चाइल्ड संबंधों के बाद unowned का दूसरा सबसे लगातार उपयोग मामला है। कैप्चर लिस्ट [unowned self] का उपयोग तब किया जाता है जब गारंटी हो कि self क्लोज़र से अधिक समय तक जीवित रहता है। आइए सही और गलत परिदृश्य देखें।

कब unowned self सुरक्षित है

समकालिक क्लोज़र्स — sorted, filter, map। वे वर्तमान थ्रेड पर तुरंत निष्पादित होते हैं, self निश्चित रूप से जीवित है। unowned के साथ कैप्चर लिस्ट यहाँ स्वीकार्य है और साफ़ कोड देती है।

swift
class DataProcessor {
    var items: [Int] = [3, 1, 4, 1, 5]

    func processSorted() {
        // ✅ unowned self — sorted समकालिक रूप से निष्पादित होता है, self गारंटीपूर्वक जीवित है
        let sorted = items.sorted { [unowned self] a, b in
            return self.customCompare(a, b)
        }
    }

    func customCompare(_ a: Int, _ b: Int) -> Bool { return a < b }
}

कब unowned self खतरनाक है

अतुल्यकालिक क्लोज़र्स — विलंब, नेटवर्क अनुरोध, एनिमेशन के साथ। क्लोज़र को शेड्यूल करने और उसके निष्पादन के बीच self मुक्त हो सकता है। यहाँ unowned self क्रैश की ओर ले जाता है। [weak self] का उपयोग करें।

swift
class NetworkLoader {
    func loadData() {
        // ❌ खतरनाक: अतुल्यकालिक क्लोज़र में unowned self
        URLSession.shared.dataTask(with: url) { [unowned self] data, _, _ in
            self.handleResponse(data)  // क्रैश यदि self मुक्त हो जाता है
        }.resume()
    }

    func handleResponse(_ data: Data?) { }

    // ✅ सही: weak self + guard
    func loadDataSafe() {
        URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in
            guard let self else { return }
            self.handleResponse(data)
        }.resume()
    }
}

नियम याद रखें: unowned self — केवल समकालिक क्लोज़र्स के लिए जो तुरंत निष्पादित होते हैं। अतुल्यकालिक क्लोज़र्स के लिए, हमेशा weak self + guard let का उपयोग करें। अपवाद: यदि आप क्लोज़र के पूरा होने तक ऑब्जेक्ट का स्पष्ट रूप से संदर्भ रखते हैं (उदाहरण के लिए, किसी अन्य चर में एक मजबूत संदर्भ रखकर)।

Unowned के जोखिम और उनसे कैसे बचें

Unowned एक शक्तिशाली लेकिन खतरनाक उपकरण है। आइए वास्तविक दुनिया के परिदृश्य देखें जहाँ unowned क्रैश का कारण बन सकता है और जोखिम को कम करने के तरीके।

रिफैक्टरिंग और गारंटी बदलना

unowned का मुख्य जोखिम व्यावसायिक तर्क में बदलाव है जो जीवनकाल गारंटी को अमान्य करता है। डेवलपर कोड रिफैक्टर करता है: स्वामित्व बदलता है, विलंबित मुक्ति शुरू करता है, कैशिंग जोड़ता है — और unowned संदर्भ एक टाइम बम बन जाता है। कंपाइलर चेतावनी नहीं देगा — केवल उपयोगकर्ता के डिवाइस पर क्रैश।

अनुशंसा: unowned का उपयोग केवल तब करें जब जीवनकाल गारंटी स्पष्ट और दस्तावेज़ीकृत हो। प्रत्येक unowned के लिए टिप्पणी जोड़ें: यह संदर्भ सुरक्षित क्यों है और किन परिस्थितियों में इसका उल्लंघन हो सकता है।

UIKit पदानुक्रम में Unowned

UIKit unowned के लिए उच्च जोखिम वाला क्षेत्र है। नेविगेशन (pop, dismiss), मेमोरी अनलोडिंग, या ओरिएंटेशन परिवर्तनों के दौरान किसी भी समय ViewController मुक्त हो सकता है। यदि आप ViewController को unowned self के साथ क्लोज़र में पास करते हैं, तो पृष्ठभूमि से लौटने या एनिमेशन पूरा होने पर self nil हो सकता है।

सर्वोत्तम अभ्यास

unowned का उपयोग करते समय जोखिम कम करने के लिए, इन नियमों का पालन करें:

  • डिफ़ॉल्ट रूप से weak पसंद करें — weak सुरक्षित है, unowned एक अनुकूलन है, मानक नहीं
  • गारंटी दस्तावेज़ीकृत करें — प्रत्येक unowned के लिए, औचित्य के साथ टिप्पणी लिखें
  • ViewController में unowned से बचें — UIKit जीवनचक्र unowned गारंटियों के लिए अप्रत्याशित है
  • unowned का उपयोग केवल समकालिक क्लोज़र्स के लिए करें — sorted, filter, map सुरक्षित उम्मीदवार हैं
  • कोड समीक्षा के दौरान जाँच करें — प्रत्येक unowned को कोड लेखक से औचित्य की आवश्यकता होती है
  • थोड़े से संदेह पर weak पर जाएँ — पठनीयता में हानि (एक guard let) प्रोडक्शन में क्रैश से कम है
swift
// उदाहरण: स्पष्ट औचित्य के साथ दस्तावेज़ीकृत unowned संदर्भ
class InvoiceLineItem {
    let productName: String
    let price: Decimal

    // unowned Invoice — InvoiceLineItem Invoice के बिना मौजूद नहीं हो सकता।
    // Invoice Item बनाता है और उसे हटाए जाने पर हटा देता है।
    // गारंटी: Invoice कम से कम उतने समय तक जीवित रहता है जितना Item।
    unowned let invoice: Invoice

    init(productName: String, price: Decimal, invoice: Invoice) {
        self.productName = productName
        self.price = price
        self.invoice = invoice
    }
}

// यह एक मजबूत गारंटी है: Invoice deinit में सभी Items हटा देता है।
// गारंटी का उल्लंघन = व्यावसायिक तर्क में बग जिसे ठीक करने की आवश्यकता है।

गारंटियों का दस्तावेज़ीकरण एक पेशेवर मानक है। बड़ी परियोजनाओं (Airbnb, Uber) में, कोड समीक्षा में प्रत्येक unowned के लिए औचित्य की आवश्यकता होती है। यदि गारंटी स्पष्ट नहीं है, तो weak का उपयोग करें। unowned पर टिप्पणी भविष्य के डेवलपर्स को यह समझने में मदद करती है कि यहाँ weak का उपयोग क्यों नहीं किया गया और कौन सी स्थितियाँ गारंटी को तोड़ सकती हैं।

अक्सर पूछे जाने वाले प्रश्न

ऑब्जेक्ट के मुक्त होने के बाद unowned संदर्भ तक पहुँचने पर क्या होता है?

रनटाइम क्रैश EXC_BAD_ACCESS के साथ। Swift पहुँच पर unowned संदर्भ की वैधता की जाँच नहीं करता — यह केवल एक “कच्चा” पॉइंटर है। यदि ऑब्जेक्ट मुक्त हो जाता है, तो मेमोरी ओवरराइट हो जाती है, और उस तक पहुँच घातक रूप से समाप्त होती है। यह एक गैर-पकड़ने योग्य अपवाद है (try-catch नहीं)।

क्या unowned का उपयोग प्रोटोकॉल के साथ किया जा सकता है?

हाँ, यदि प्रोटोकॉल AnyObject से प्राप्त होता है। Unowned सभी संदर्भ प्रकारों के साथ काम करता है: क्लासेस, AnyObject प्रोटोकॉल, Objective-C ऑब्जेक्ट। मान प्रकार (struct, enum) unowned का समर्थन नहीं करते क्योंकि वे ARC में भाग नहीं लेते।

कब unowned weak से अधिक सुरक्षित है?

जब जीवनकाल गारंटी पूर्ण और स्पष्ट हो — unowned डिज़ाइन के दृष्टिकोण से अधिक सुरक्षित है: इसे unwrap की आवश्यकता नहीं है, यह nil नहीं हो सकता, और त्रुटियों को छिपाता नहीं है। यदि कोई ऑब्जेक्ट माता-पिता के बिना मौजूद नहीं हो सकता, तो unowned इसे स्पष्ट अनुबंध बनाता है, जबकि weak गारंटी को धुंधला करता है।

क्या unowned और weak के बीच प्रदर्शन में अंतर है?

हाँ: unowned तेज़ है क्योंकि इसे शून्यीकरण के लिए रनटाइम weak तालिका तक पहुँच की आवश्यकता नहीं होती। अधिकांश एप्लिकेशन में अंतर अगोचर है, लेकिन लाखों पहुँच वाले उच्च-लोड परिदृश्यों में, unowned पढ़ने में 10–20% तेज़ हो सकता है।

रिफैक्टरिंग unowned गारंटियों को कैसे प्रभावित करती है?

रिफैक्टरिंग unowned का मुख्य खतरा है। ऑब्जेक्ट के जीवनकाल (कैशिंग, अतुल्यकालिक संचालन, पुन: उपयोग) को बदलने से गारंटी टूट सकती है। कंपाइलर चेतावनी नहीं देगा। समाधान: आर्किटेक्चर बदलते समय weak पर जाएँ या चेतावनी टिप्पणी जोड़ें।

सारांश

  • Unowned Reference — शून्यीकरण के बिना गैर-मालिकाना संदर्भ; गैर-वैकल्पिक, retain count नहीं बढ़ाता
  • गारंटी — स्पष्ट प्रमाण की आवश्यकता है कि ऑब्जेक्ट कम से कम उस कोड के बराबर जीवित रहता है जो इसे संदर्भित करता है
  • सिंटैक्सunowned let या unowned var; गैर-वैकल्पिक और वैकल्पिक (Swift 5.0+) हो सकता है
  • Unowned vs Weak — unowned तेज़ और साफ़ है, लेकिन weak अधिक सुरक्षित है; weak डिफ़ॉल्ट विकल्प है
  • क्लोज़र्स — unowned self केवल समकालिक क्लोज़र्स के लिए; अतुल्यकालिक को [weak self] की आवश्यकता है
  • दस्तावेज़ीकरण — प्रत्येक unowned के पास गारंटी का औचित्य बताने वाली टिप्पणी होनी चाहिए
  • अनुशंसा — संदेह होने पर weak चुनें; unowned स्पष्ट और दस्तावेज़ीकृत अनुबंधों के लिए है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें