2012-05-22 15 views
6

पांच मिनट तक मुझे यकीन था कि उद्देश्य सी संदर्भ गिनती के बारे में मेरी समझ उत्कृष्ट है, लेकिन जब मैंने वस्तुओं को बनाए रखने की जांच शुरू की तो मैं देख रहा था कि मैंने क्या देखा है।उद्देश्य सी - संदर्भ गिनती

उदाहरण myViewController के लिए एक UITableView है:

ज फ़ाइल

@interface RegularChatViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    UITableView *_tableView; 
} 
@property (nonatomic, retain) IBOutlet UITableView *tableView; 

मीटर फ़ाइल

@synthesize tableView = _tableView; 

- (void)loadView 
{ 
    _tableView = [[UITableView alloc] init]; // STEP ONE 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 

    self.tableView.frame = CGRectMake(0, 0, 320, tableHeight); // STEP TWO 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 

    [self.view addSubview:self.tableView]; // STEP THREE 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 
} 
मेरे आश्चर्य इनपुट था करने के लिए

:

tableView retain count: 1 
tableView retain count: 2 
tableView retain count: 3 

स्पष्ट रूप सेकदम एक वृद्धि alloc

साथ 1 से गिनती बनाए रखने मैं भी है कि कदम तीन वृद्धि पता addSubview

लेकिन क्या कदम दो में चल रही के साथ 1 से गिनती बनाए रखने ??? यह बरकरार गिनती क्यों बढ़ाया ???
एआरसी के साथ कुछ करने के लिए है ??

+0

शायद क्योंकि '.frame' तालिका दृश्य के बिना मौजूद नहीं हो सकता है और इसलिए बनाए रखने की गिनती जोड़ता है? –

+0

अच्छा अनुमान; लेकिन 'फ्रेम 'सीधे एक संरचना देता है; एक संदर्भ भी नहीं। वहां कोई निर्भरता नहीं है। वास्तव में – bbum

उत्तर

7

retainCount विधि के लिए NSObject Protocol Reference पर एप्पल डॉक्स के अनुसार:

महत्वपूर्ण इस विधि स्मृति प्रबंधन के मुद्दों को दूर करने में कोई मूल्य नहीं की आम तौर पर है। चूंकि फ्रेमवर्क ऑब्जेक्ट्स की किसी भी संख्या ने संदर्भ को पकड़ने के लिए किसी ऑब्जेक्ट को बनाए रखा हो सकता है, जबकि साथ ही ऑटोरेलीज पूल किसी ऑब्जेक्ट पर किसी भी प्रकार की स्थगित रिलीज हो सकता है, यह बहुत संभावना नहीं है कि आप इससे उपयोगी जानकारी प्राप्त कर सकें तरीका।

+1

। मैं वास्तव में चिंतित हूं जब मैं डेवलपर्स को अपने कोड में गिनती को बरकरार रखने के लिए देखता हूं। जब तक आप स्वामित्व के नियमों का पालन करते हैं और कुछ समय में लीक टूल का उपयोग करते हैं, तो आप सुनहरे होते हैं। –

+0

यह एक राहत है :) धन्यवाद – Eyal

2

जैसे ही आप किसी भी ढांचे विधि या समारोह के साथ बातचीत के रूप में, retainCount विधि पूरी तरह से बेकार हो जाता है, क्योंकि आप क्या इन बातों को अपने ब्लैक बॉक्स में क्या (वे अपने वस्तुओं पूल autorelease करने के लिए जोड़ सकते हैं पता नहीं है या जो भी हो) और आपको इसकी परवाह नहीं करनी चाहिए।

स्मृति प्रबंधन समस्याओं को डीबग करने के लिए retainCount का उपयोग करना हमेशा एक बुरा विचार है। इससे बचने के और भी कारणों के लिए this answer देखें। When to use retainCount?

संक्षेप में, retainCount शायद ही कभी इसका मतलब है आप क्या सोचते हैं यह होगा:

2

मैं यहाँ एक आसान गाइड है। यह जानने के बिना कि UITableView और UIView लागू किए गए हैं नहीं जानते कि बनाए रखने की गणना क्या होनी चाहिए। और हम खाते में ऑटोरेलीज भी नहीं ले रहे हैं ...

+0

यह वास्तव में एक उपयोगी वेब पेज नहीं है, और मुझे इसे यहां पोस्ट करने से नफरत है। कोई स्पष्टीकरण वाला एक भी शब्द सिर्फ लिंक पोस्टर को जॉली देता है; यह पूछताछ में थोड़ा मदद नहीं करता है। –

+0

क्या आपने नीचे स्क्रॉल किया था? यह भी ध्यान रखें कि मैंने उत्तर में सभी प्रासंगिक जानकारी शामिल की है। –

+0

बेशक, जवाब ठीक है। मैंने कभी पेज पर स्क्रॉल नहीं किया था, नहीं। नीचे दिए गए लिंक के साथ, यह मैंने सोचा जितना बेहतर है, लेकिन मैं अकेला नहीं हो सकता जिसने यह माना कि वहां कुछ और नहीं था, क्योंकि आपने इसे सेट अप किया है ताकि अधिकांश स्क्रीन के लिए कोई भी नहीं शुरुआत में नीचे सामग्री दिखाता है। –

0

चरण दो में अच्छी तरह से: - स्वयं का उपयोग करके। टेबल व्यू, टेबलव्यू प्रॉपर्टी (जिसे सेट किया गया है) का गेटटर बुलाया जाएगा। इसलिए आपकी संपत्ति को आवंटित और बनाए रखा गया है, इसलिए क्रमशः गिनती बढ़ जाती है।

जब भी आपको एक बनाए रखा संपत्ति आवंटित करनी होती है, तो आपको इसकी गेटटर विधि को ओवरराइट करना चाहिए और इसे आलसी तत्काल कहा जाता है।

अपने गेटटर में अपने टेबलव्यू को बेहतर आवंटित करें उदा।

-(UITableView *) tableView 
{ 
    if(!_tableView) { 
      _tableView = [[UITableView alloc]init]; 
    } 

    return _tableView; 
} 
0

self.tableView.frameretain और autorelease होगा जब गेटर से tableView लौटने।

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