2009-10-22 10 views
12

मेरे पास एक स्थिर विधि है जो कक्षा का एक उदाहरण बनाता है और इसे स्थिर चर में रखती है। मैं सोच रहा हूं कि इस स्थिति में स्मृति प्रबंधन का उचित तरीका क्या है।उद्देश्य-सी/आईफोन मेमोरी प्रबंधन स्टेटिक वैरिएबल

आप dealloc-विधि में ऐसा नहीं डाल सकते हैं, क्योंकि हालांकि यह स्थिर चर कि बनाई गई है किसी भी उदाहरण विधि है कि मिल भी sharedInstance जारी करेंगे जारी है पहुँच सकते हैं।

मुझे लगता है कि एक स्थिर विनाश विधि बनाने का विकल्प हो सकता है जो मैन्युअल रूप से स्मृति को रिलीज़ करेगा और उपयोगकर्ता द्वारा ऐपविल टर्मिनेट से बुलाया जा सकता है, लेकिन यह थोड़ा अजीब लगता है।

तो, फिर से, प्रश्न: स्थैतिक चर जारी करने का सही तरीका क्या है?


// MyClass.m 
#import "MyClass.h" 

static MyClass *myClass; // How to properly do memory management 

@implementation MyClass 

+ (MyClass *)sharedMyClass { 
    if (myClass == nil) myClass = [[MyClass alloc] init]; 
    return myClass; 
} 
@end 

उत्तर

8

आप या तो नहीं है, उन्हें छोड़ सकते हैं जो ठीक है के बाद से एप्लिकेशन वैसे भी बंद हो रहा है। आईफोन पर कोको पहले से ही ऐसा करता है, यह सब कुछ पूरी तरह से हटा नहीं देता है, यह सिर्फ ऐप को उड़ा देता है।

या आप appWillTerminate या कुछ अन्य शटडाउन समारोह से इसे हटा सकते हैं।

+3

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

7

आप "Creating a Singleton" iPhone देव केंद्र पर पर एक नज़र कैसे ठीक है कि पैटर्न लागू करने के लिए देखने के लिए करना चाहते हैं। आप अपने सिंगलटन को रिहा नहीं करेंगे, जब एप्लिकेशन निकलता है तो बस इसे मरने दें।

इसके अलावा, अगर आप थ्रेड रहे हैं तो आप शायद एक @synchronize (स्वयं) में है कि alloc रैप करने के लिए {}

यहाँ पूरा टेक्स्ट है चाहता हूँ:

फाउंडेशन के कुछ वर्गों और एप्लिकेशन किट सिंगलटन ऑब्जेक्ट्स बनाएं। एक "सख्त" कार्यान्वयन में, एक सिंगलटन वर्तमान प्रक्रिया में एक वर्ग का एकमात्र स्वीकार्य उदाहरण है। लेकिन क्या आप भी जबकि UIApplication फिट बैठता है, में एक और अधिक लचीला सिंगलटन कार्यान्वयन जो एक कारखाने विधि हमेशा रिटर्न एक ही उदाहरण हो सकता है, लेकिन आप आवंटित कर सकते हैं और अतिरिक्त instances.The NSFileManager वर्ग को प्रारंभ हो गया बाद इस पैटर्न पूर्व। जब आप यूआईपीप्लिकेशन के उदाहरण के लिए पूछते हैं, तो यह आपको एकमात्र उदाहरण के संदर्भ में आवंटित करता है और इसे अभी तक मौजूद नहीं है।

एक सिंगलटन वस्तु, नियंत्रण केंद्र के एक प्रकार के रूप में कार्य करता निर्देशन या वर्ग की सेवाओं का समन्वय। आपकी कक्षा एक सिंगलटन उदाहरण के बजाय कई उदाहरण उत्पन्न करनी चाहिए जब वहाँ धारणात्मक केवल एक उदाहरण (साथ , उदाहरण के लिए, NSWorkspace के रूप में)। आप कारखाने तरीकों के बजाय सिंगलटन उदाहरणों या कार्यों का उपयोग जब यह बोधगम्य है कि वहाँ कई उदाहरण एक दिन हो सकता है।

वर्तमान प्रक्रिया में एक वर्ग के एकमात्र स्वीकार्य उदाहरण के रूप में एक सिंगलटन बनाने के लिए, आप एक कार्यान्वयन लिस्टिंग 2-15 के लिए इसी तरह की आवश्यकता है। यह कोड निम्न कार्य करता है:

अपने सिंगलटन ऑब्जेक्ट का एक स्थिर उदाहरण घोषित करें और इसे शून्य पर प्रारंभ करें। कक्षा के लिए अपनी कक्षा फैक्ट्री विधि में ( "साझा किया गया" या "साझा प्रबंधक" जैसे कुछ नाम दिया गया है, कक्षा का एक उदाहरण उत्पन्न करता है लेकिन केवल स्थिर उदाहरण शून्य है। ओवरराइड allocWithZone: को विधि सुनिश्चित करना है कि एक और उदाहरण किसी वर्ग कारखाने विधि का उपयोग कर के आबंटित कर अपने वर्ग का एक उदाहरण प्रारंभ करने के बजाय सीधे कोशिश करता है तो नहीं आवंटित है। इसके बजाय, बस साझा ऑब्जेक्ट को वापस करें। कार्यान्वयन बेस प्रोटोकॉल विधियों कॉपीविथज़ोन: रिलीज, बनाए रखने, retainCount, और को सिंगलटन स्थिति सुनिश्चित करने के लिए उचित चीजों को करने के लिए स्वत: बदलें। (इन तरीकों के अंतिम चार, स्मृति-प्रबंधित कोड के लिए लागू कचरा-एकत्र कोड के लिए नहीं।) लिस्टिंग की 2-15 सख्त कार्यान्वयन एक सिंगलटन स्थिर MyGizmoClass

*sharedGizmoManager = nil; 
+ (MyGizmoClass*)sharedManager { 
    if (sharedGizmoManager == nil) { 
     sharedGizmoManager = [[super allocWithZone:NULL] init]; 
    } 
    return sharedGizmoManager; } 
+ (id)allocWithZone:(NSZone *)zone { 
    return [[self sharedManager] retain]; } 

- (id)copyWithZone:(NSZone *)zone { 
    return self; } 

- (id)retain { 
    return self; } 

- (NSUInteger)retainCount { 
    return NSUIntegerMax; //denotes an object that cannot be released } 

- (void)release { 
    //do nothing } 

- (id)autorelease { 
    return self; } 

आप तो एक सिंगलटन इंस्टेंस (बनाया गया और क्लास फैक्ट्री विधि द्वारा नियंत्रित) है, लेकिन की क्षमता भी आवंटन और प्रारंभिकरण के माध्यम से आवश्यक अन्य उदाहरण बनाएं, allocWith को ओवरराइड न करें जोन: और लिस्टिंग 2-15 में दिखाए गए अनुसार अन्य विधियों का पालन करें।


अद्यतन: अब एक बहुत आसान आप @syncronize बारे में चिंता करने की जरूरत नहीं है इस नई शैली का उपयोग करते हुए एक सिंगलटन

+ (MyClass*)sharedInstance 
{ 
    static MyClass* _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _sharedInstance = [[MyClass alloc] init]; 
    }); 

    return _sharedInstance; 
} 

बनाने के लिए जिस तरह से या स्मृति प्रबंधन अधिभावी है तरीकों।

1

स्थिर चर या वर्ग अपने आवेदन

तो अगर यह अप्रयुक्त है की स्मृति जब तक जीवन में बनी हुई है, जबकि घोषित उपयोग स्थिर _datatype चर = शून्य तो

Your_variable = nil; 

बनाते हैं; जो जबकि आरंभ में मदद .. और स्मृति प्रबंधन

///************************** 
// MyClass.m 
#import "MyClass.h" 

static MyClass *myClass = nil; 

@implementation MyClass 

+ (MyClass *)sharedMyClass { 
    if (myClass == nil) 
      myClass = [[MyClass alloc] init]; 
    return myClass; 
} 

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