iphone महत क्या मुझे xib संसाधनों को जारी करने की आवश्यकता है?




संसाधन की परिभाषा (7)

यदि मेरे पास एक xib फ़ाइल से जुड़े एक यूआईएलबल की तरह कुछ है, तो क्या मुझे इसे मेरे दृश्य के डेअलोक पर रिलीज करने की आवश्यकता है? कारण मैं पूछ रहा हूं क्योंकि मैं इसे आवंटित नहीं करता, जिससे मुझे लगता है कि मुझे इसे रिलीज करने की ज़रूरत नहीं है? उदाहरण (शीर्षलेख में):

IBOutlet UILabel *lblExample;

कार्यान्वयन में:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}


मुझे एप्पल डॉक्स में जो भी दिख रहा था वह मिला। संक्षेप में आप अपने ऑब्जेक्ट को अपनी रिहाई और बनाए रखने वाले गुणों (या सिर्फ @ प्रॉपर्टी, सिंटिसाइज़) के रूप में स्थापित कर सकते हैं, लेकिन आपको यूआईएलएब्लेल्स जैसी चीज़ों के लिए नहीं करना है:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18


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


[anOutlet release], anOutlet = nil;

यदि आपने setView लिखा है, तो पार्ट पूरी तरह अनावश्यक है: सही तरीके से।


आप आईबी में इसे बनाकर लेबल को आवंटित करते हैं।

आईबी क्या करता है, आपके आईबीओलेटलेट को और कैसे परिभाषित किया जाता है। यदि आपके पास एक क्लास चर है जिसमें आईबी कुछ ऑब्जेक्ट के संदर्भ को निर्दिष्ट करने के लिए है, तो आईबी आपके लिए ऑब्जेक्ट को एक बनाए रखने का संदेश भेज देगा।

यदि आप गुणों का उपयोग कर रहे हैं, तो आईबी आपकी संपत्ति का उपयोग करने के लिए मूल्य निर्धारित करेगा और स्पष्ट रूप से मूल्य को बनाए नहीं रखेगा। इस प्रकार आप सामान्य रूप से IBOutlet गुणों को बनाए रखने के रूप में चिह्नित करेंगे:

@property (nonatomic, retain) UILabel *lblExample;

इस प्रकार ईथर मामले में (गुणों का उपयोग करना या नहीं) आपको अपने डेलोक में रिलीज करना चाहिए


अगर आप सबसे अच्छा अभ्यास माना जाता है, तो आपको आउटलेट प्रॉपर्टी रिलीज़ करनी चाहिए , क्योंकि आपको उन्हें सेट एक्सेसर में रखा जाना चाहिए था:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

इस दृष्टिकोण का लाभ यह है कि यह स्मृति प्रबंधन शब्दों को स्पष्ट और स्पष्ट बनाता है, और यह सभी निब फ़ाइलों के लिए सभी प्लेटफॉर्म पर लगातार काम करता है

नोट: निम्नलिखित टिप्पणियां केवल 3.0 से पहले आईओएस पर लागू होती हैं। 3.0 और उसके बाद के साथ, आपको इसके बजाय केवल संपत्ति मानों को देखने के लिए चाहिए। DIDUnload में

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

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

दुर्भाग्य से यह एक और मुद्दे को जन्म देता है चूंकि UIViewController वर्तमान में setView: का प्रयोग करते हुए अपने dealloc विधि का कार्यान्वयन करता है setView: विधि (केवल सीधे self.anOutlet = nil जारी करने के बजाय), self.anOutlet = nil को dealloc में तथा साथ ही स्मृति चेतावनी के जवाब में बुलाया जाएगा ... यह एक dealloc में दुर्घटना

इसका उपाय यह सुनिश्चित करना है कि आउटलेट वेरिएबल भी nil में nil करने के लिए सेट हैं:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}





cocoa-touch