7

क्या यह विधि के कार्यान्वयन के हस्ताक्षर में __weak स्टोरेज संशोधक का उपयोग करने के लिए मान्य है? विशेष रूप से यदि यह विधि के सार्वजनिक हस्ताक्षर का हिस्सा नहीं है? उदाहरण के लिए:कार्यान्वयन में पैरामीटर के संग्रहण को संशोधित करने के लिए __weak का उपयोग

- (UIView *)tableView:(__weak UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionIndex 
{ 
    UIView *view = [ABHeaderView view]; 
    view.actionBlock = ^{ 
     [tableView doSomething]; 
    } 
    // ... 
    return view; 
} 

इस सही ढंग से एक कमजोर सूचक के रूप में tableView उपयोग करता है? या मुझे वास्तव में __weak *weakTableView = tableView; जैसे कुछ करना चाहिए और ब्लॉक के भीतर weakTableView का उपयोग करना चाहिए?

मुझे कोई चेतावनी या त्रुटियां नहीं मिलती हैं और क्लैंग स्टेटिक विश्लेषक किसी भी चेतावनी को फेंक नहीं देता है।

उत्तर

1

गतिशील प्रेषण शामिल होने और ओवरराइडिंग (1) जब स्टोरेज संशोधक या विशेषताओं को 'गतिशील रूप से' सम्मानित करने के लिए गुणों पर भरोसा न करें।

यह विधि औपचारिक रूप से UIKit में घोषित की गई है। एआरसी का उपयोग करते समय संकलक इसे गलत हो सकता है क्योंकि यह चयनकर्ता को मूल घोषणा के लिए मिलान कर सकता है जब बुलाया जाता है। यही है, आपकी घोषणा UIKit को दिखाई नहीं दे रही है, और UIKit इसे एआरसी के रूप में संकलित होने पर डिफ़ॉल्ट/मजबूत के रूप में भी व्यवहार करेगा। यह तब हो सकता है जब घोषणाएं मेल न हों, या भले ही वे क्लाइंट + कॉलर अनुवाद में दिखाई न दें।

पैरामीटर प्रकार/विशेषता चयनकर्ता का हिस्सा नहीं हैं, न ही वे गतिशील रूप से प्रेषण के लिए लागू होते हैं। एआरसी को यहां मजबूत मानना ​​चाहिए, और कॉलर संदर्भ रखता है। यह विशिष्ट उदाहरण रनटाइम त्रुटि का कारण नहीं बन सकता है, लेकिन यह एक संदिग्ध अभ्यास है जो मुझे लगता है कि त्रुटियां मिल सकती हैं। मैंने यह गुण in this answer के लिए साबित कर दिया है। मूल रूप से, यह एक समान अवधारणा है।

डायनामिक ओबीजेसी प्रेषण के साथ सरल नियम: पुनर्विक्रय, परिभाषित करने और ओवरराइड करते समय मूल घोषणा के हस्ताक्षर से हमेशा मिलान करें। सीए संगत क्वालीफायर के लिए एकमात्र अपवाद हो सकता है जो हस्ताक्षर को बदल नहीं पाएगा (एक बहुत un मैंने देखा ओबीजेसी कार्यक्रमों में सामान्य अभ्यास)।

(1) तकनीकी रूप से, यह ओवरराइड नहीं है, लेकिन प्रोटोकॉल की विधि का कार्यान्वयन है। भले ही, सिग समान होना चाहिए।

0

__strong या __weak स्टोरेज संशोधक आपके आंतरिक कार्यान्वयन का हिस्सा हैं, जहां तक ​​मैं देख सकता हूं। वे विधि के कॉलर द्वारा उत्पन्न कोड को प्रभावित नहीं करते हैं, इसलिए मुझे लगता है कि आप अभी सुरक्षित हैं और भविष्य में बहुत संभावना है।

मुझे लगता है कि यह खराब शैली है, हालांकि, कमजोर संदर्भ के संदर्भ की प्रतिलिपि बनाने का आपका सुझाव एक अच्छा समाधान लगता है।

संबंधित मुद्दे

 संबंधित मुद्दे