मैं एआरसी का उपयोग करके आईओएस ऐप लिख रहा हूं और आईओएस 5+ को लक्षित कर रहा हूं।एआरसी के तहत नील में प्रतिनिधियों को सेट करें?
मान लीजिए कि मैं एक कस्टम व्यू ऑब्जेक्ट लिखता हूं जिसमें एक प्रतिनिधि संपत्ति है। प्रतिनिधि संपत्ति घोषित करने में, मैं यह एक कमजोर संदर्भ के रूप में इस एक, चक्र को बनाए रखने के लिए इतना है कि जब वास्तविक प्रतिनिधि वस्तु (नियंत्रक) नष्ट हो जाता है, मेरे कस्टम दृश्य भी नष्ट हो जाएगा, से बचने के लिए करते हैं:
@interface MyCustomView : UIView
@property (nonatomic, weak) id<MyCustomViewDelegate> delegate;
@end
सब अच्छा है।
ठीक है, तो अब मैं नियंत्रक ऑब्जेक्ट लिख रहा हूं, और इसमें दो दृश्य वस्तुओं का संदर्भ है: मेरा कस्टम व्यू और एक ऐप्पल-आपूर्ति यूआईकिट व्यू, जिनमें से दोनों प्रतिनिधि गुण घोषित करते हैं, और नियंत्रक प्रतिनिधि के लिए प्रतिनिधि है दोनों विचार
@interface MyViewController : UIViewController <MyCustomViewDelegate, UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) MyCustomView *customView;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyViewController
- (void)viewDidLoad
{
self.customView.delegate = self;
self.tableView.dataSource = self;
self.tableView.delegate = self;
}
@end
मेरा प्रश्न यह है:: शायद यह कुछ इस तरह दिखता मैं या तो या नहीं के बराबर करने के लिए दोनों प्रतिनिधियों स्थापित करने के लिए dealloc ओवरराइड करने के लिए की जरूरत है?
मेरा मतलब है, के रूप में मैं इसे समझ, UIKit देखने के प्रतिनिधि संपत्ति (इस मामले में, tableView
) वास्तव में एक कमजोर संदर्भ, बल्कि एक __unsafe_unretained
संदर्भ के लिए, एआरसी के साथ पीछे संगतता के लिए घोषित किया नहीं है आईओएस का संस्करण। तो शायद मैं
- (void)dealloc
{
_tableView.dataSource = nil;
_tableView.delegate = nil;
}
लिखने के लिए अब जरूरत है, अगर मैं dealloc ओवरराइड करने के लिए क्या है, मैं अभी भी _customView.delegate = nil
, सही स्थापित करने के लिए नहीं है? क्योंकि यह घोषित किया गया था (मेरे द्वारा) एक कमजोर संदर्भ होने के लिए, इसलिए इसे MyViewController
के विनाश पर स्वचालित रूप से शून्य करने के लिए सेट किया जाना चाहिए।
लेकिन दूसरी तरफ, मैं आईओएस के गैर-एआरसी संस्करणों को लक्षित नहीं कर रहा हूं, न ही मेरा इरादा है। तो शायद मुझे डेलोक को ओवरराइड करने की आवश्यकता नहीं है?
आपको इस बारे में पता नहीं हो सकता है, लेकिन वर्तमान अनुशंसा यह है कि आईबीऑलेट्स * दृश्य पदानुक्रम में निहित * कमजोर होना चाहिए। दूसरे शब्दों में, यदि तालिका दृश्य दृश्य में निहित है, तो दृश्य मजबूत संदर्भ द्वारा आयोजित किया जाता है और तालिका दृश्य को होने की आवश्यकता नहीं होती है। इससे आपका मामला थोड़ा कृत्रिम बना देता है, हालांकि यह अभी भी उस मामले के लिए एक वैध सवाल है (जिसमें अन्य, अधिक वास्तविक उदाहरण हैं)। –
@StevenFisher धन्यवाद, स्टीवन। मुझे इस बारे में पता था, लेकिन मेरे उदाहरण में, मैंने दृश्य गुणों को आईबीओटलेट घोषित नहीं किया; शायद मैं उन्हें आईबी के बजाय प्रोग्रामेटिक रूप से उत्पन्न कर रहा हूं। –
@StevenFisher मुझे लगता है कि मैं '__weak' और '__unsafe_unretained' संपत्ति घोषणाओं के बीच का अंतर है, और आईओएस के पोस्ट-एआरसी संस्करणों को लक्षित करते समय उन अलग-अलग घोषणाओं के लिए मेरी ज़िम्मेदारी क्या है। –