मेमोरी लीक से बचने और दक्षता बढ़ाने के लिए मुझे Apple इंजीनियरों से दो सुझाव मिले

समस्याओं को खत्म करने के लिए हमारे साधन का प्रयास करें

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

जबकि एआरसी अधिकांश मेमोरी प्रबंधन का प्रबंधन करता है, एक मजबूत संदर्भ चक्र आपके ऐप से मेमोरी लीक का कारण बन सकता है।

इस तरह के एक बनाए रखने के चक्र के लिए एक सामान्य उपयोग का मामला तब होता है जब स्वयं को कक्षा में बंद करने के अंदर कब्जा कर लिया जाता है।



एक मजबूत संदर्भ चक्र भी हो सकता है यदि आप एक क्लास इंस्टेंस की संपत्ति को क्लोजर असाइन करते हैं, और उस क्लोजर का बॉडी इंस्टेंस को कैप्चर करता है। - स्विफ्ट.ओआरजी

में मेंटरशिप आईओएस ऐप , हमारे पास नेटवर्क कॉल करते समय और सिंक ऑपरेटर में गुण निर्दिष्ट करते समय ये चक्र बनाए रखते थे।

import Foundation import Combine class Members: ObservableObject { @Published var membersResponseData = [MembersModel.MembersResponseData]() private var cancellable: AnyCancellable? func fetchMembers() { cancellable = NetworkManager.callAPI(urlString: URLStringConstants.members) .receive(on: RunLoop.main) .catch { _ in Just(self.membersResponseData) } .sink { members in // RETAIN CYCLE : strong capturing of self in a closure in a class self.membersResponseData = members } } }

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

समाधान:

मजबूत संदर्भ चक्र को बंद करने में कमजोर आत्म को पकड़कर आसानी से हल किया जा सकता है।

नोड जेएस सरणी से जेसन
.sink { [weak self] members in self?.membersResponseData = members }

#स्विफ्टुई #प्रोग्रामिंग #आईओएस #मेमोरी-लीक #स्विफ्ट-प्रोग्रामिंग

माध्यम.कॉम

मेमोरी लीक से बचने और दक्षता बढ़ाने के लिए मुझे Apple इंजीनियरों से दो सुझाव मिले

मेमोरी लीक से बचने और स्विफ्टयूआई में दक्षता बढ़ाने के लिए मुझे ऐप्पल इंजीनियरों से दो युक्तियां मिलीं।

यह सभी देखें: