2009-03-19 11 views
7

यदि मैं उद्देश्य-सी में कक्षा चर घोषित करता हूं, तो स्मृति कब जारी की जाती है?उद्देश्य-सी वर्ग चर: जब डेलोक कहा जाता है?

अगर मेरे इंटरफेस है:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

और कार्यान्वयन में, मैं घोषणा:

static NSString instanceCount; 

मैं इस वर्ग के स्तर चर कैसे जारी कर सकता हूँ? यानी उद्देश्य-सी में कक्षा चर के लिए बुलाया जाने वाला डेलोक कब होता है?

+3

ओब्जे-सी सीखते समय बस इस प्रश्न में आया। ऐप्पल का सुझाव है कि "क्लास वेरिएबल" जैसी कोई चीज नहीं है और आपने इंटरफ़ेस में जो परिभाषित किया है वह क्लास * विधि * है, जो स्थैतिक चर से अलग है और इस प्रकार कार्यान्वयन में परिभाषित किया जाना चाहिए। स्थैतिक चर कार्यान्वयन * फ़ाइल * के दायरे तक ही सीमित है, कक्षा नहीं। हो सकता है कि यह एक मामूली वक्रोक्ति है लेकिन यह मुझे एक सेकंड के लिए उलझन में: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

उत्तर

10

आपके प्रश्न का संक्षिप्त उत्तर यह है: "जब कार्यक्रम निकलता है।"

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

यदि आप इस व्यवहार की निगरानी करने की कोशिश कर रहे हैं, तो शायद आपके पास बहुत भाग्य नहीं होगा। उदाहरण के लिए, अगर तुमने किया था एक कस्टम वर्ग में निम्नलिखित हैं और किसी दूसरे वर्ग के एक सदस्य के रूप में स्थिर उस वर्ग का प्रयोग किया:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

आपको यह संदेश दिखाई कभी नहीं होगा लॉग में दिखाई देते हैं। इसके पीछे कुछ कारण हैं। एक, वेरिएबल्स जो NSLog() की आवश्यकता है, सामान्य शट डाउन प्रक्रिया के हिस्से के रूप में पहले से ही हटा दिया जा सकता है। और दो, क्योंकि रनटाइम सिस्टम dealloc विधियों को कॉल करने के लिए परेशान किए बिना, शेष शॉट में सभी शेष मेमोरी को आसानी से रिलीज़ कर सकता है।

यदि आपकी कस्टम कक्षा dealloc विधि में कुछ महत्वपूर्ण है तो यह समस्याग्रस्त हो सकती है। यदि ऐसा है, तो एक कस्टम cleanup विधि लिखने पर विचार करें जिसे आप प्रोग्राम से बाहर निकलने से ठीक पहले इन ऑब्जेक्ट्स के लिए कॉल करते हैं।

+0

इस तथ्य का जिक्र नहीं है कि डेलोक एक उदाहरण विधि है और कक्षा – cobbal

+0

हम्म के लिए 0 या 100 बार बुलाया जा सकता है, हां, लेकिन मैं इस विधि को किसी ऑब्जेक्ट में सोच रहा था जिसका उपयोग किया गया था एक और वर्ग के स्थिर सदस्य। मैंने (उम्मीद है) मेरे जवाब में इसे मंजूरी दे दी है। यह इंगित करने के लिए धन्यवाद! –

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