2011-11-06 6 views
5

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

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"]; 

आपको इसे पहले आवंटित करने के लिए ऐसा कुछ क्यों नहीं करना है?

UIAlert *alert = [[UIAlertView alloc]] 

मुझे यकीन है कि सिर्फ उद्देश्य सी में कुछ बुनियादी बात मैं याद कर रहा हूँ है हूँ, लेकिन अजीब तरह से पर्याप्त पोस्ट किए बिना एक स्पष्टीकरण खोजने एक कठिन समय चल रहा है। धन्यवाद!!

+0

@jrturton: जैसा कि मैंने कहा, हाँ मेरे पास है और यह मुझे बहुत समझ में नहीं आता है, मुझे आमतौर पर यहां अच्छी व्याख्याएं मिलती हैं, इसलिए मैंने सोचा कि कोई अच्छा जवाब दे सकता है। ऐप्पल डेवलपर दस्तावेज भयानक है और भयानक होने के लिए जाना जाता है। मेरी सामग्री का जवाब देते समय कृपया सवालों के वास्तविक जवाब दें। मेरे द्वारा इसकी सराहना की जाएगी। – gcoleman0828

+0

कहीं भी आपके प्रश्न में आप दस्तावेज़ीकरण को पढ़ने के बारे में कुछ नहीं कहते हैं या आपको किन हिस्सों में समस्याएं हैं। इतना रक्षात्मक मत बनो! – jrturton

उत्तर

6
समस्या

(करने के लिए इस वस्तु स्वचालित रूप से autorelease संदेश भेजने है) कि यह इसके परिणाम को बरकरार रखता है, यही कारण है कि इसे बाद में -release या -autorelease पर कॉल के साथ संतुलित किया जाना चाहिए। करने के लिए टाइप करने के लिए है कि बाहर से अधिक और हर बार एक वर्ग, एपीआई डिजाइनरों सामान्यतः बनाने क्या एक सुविधा निर्माता या सुविधा विधि कहा जाता है प्रयोग किया जाता है से अधिक होने से बचने के। +URLWithString: उनमें से एक है, और आंतरिक रूप से यह इस तरह दिखता है:

+ (id)URLWithString: (NSString *)str { 
    return [[[self alloc] initWithString: str] autorelease]; 
} 

तो +alloc आप के लिए बुलाया जा रहा है, और इसलिए -autorelease है।

पृष्ठभूमि

ऑब्जेक्टिव-सी में तरीकों में से दो व्यापक प्रकार के होते हैं: वर्ग के तरीकों और उदाहरण तरीकों। कक्षा विधियों को कक्षा में पर भेजा जाता है और उस वर्ग के उदाहरण के निर्माण की आवश्यकता नहीं होती है। इंस्टेंस विधियों को एक उदाहरण में भेजा जाता है और उदाहरण पर मौजूद स्मृति को एक्सेस कर सकते हैं। कक्षा के तरीके + से शुरू होते हैं; - के साथ उदाहरण विधियां।

+alloc एक क्लास विधि है। यह विशेष वस्तु-निर्माण शक्तियों के साथ एक जादुई नहीं है। यह आंतरिक रूप से कुछ है:

+ (id)alloc { 
    id result = malloc(class_getInstanceSize(self)); 
    if (result) { 
     memset(result, 0, class_getInstanceSize(self)); 
     result->isa = self; 
     result->retainCount = 1; 
    } 
    return result; 
} 

(यह वास्तव में उससे थोड़ा अधिक जटिल है लेकिन यह पर्याप्त होना चाहिए।) ध्यान दें कि +alloc को NSObject, सभी ऑब्जेक्ट्स का हिस्सा नहीं माना जाता है। कोको स्मृति प्रबंधन, +alloc, -init, -retain, -release, आदि हमेशा उद्देश्य-सी का हिस्सा नहीं है, और वस्तुओं को बनाया जा सकता है जो इसका उपयोग नहीं करते हैं।

यदि आप सही इन्सेंटेशन जानते हैं तो आप +alloc पर कॉल किए बिना वास्तव में कक्षा के उदाहरण बना सकते हैं। मैं इसकी सिफारिश नहीं करता।

+0

के रूप में सबसे अच्छा choise है विस्तृत उत्तर के लिए धन्यवाद। जो उस बारे में उलझन में था उस पर थोड़ा और प्रकाश डालता है। एक बार फिर धन्यवाद! – gcoleman0828

2

आपके स्वामित्व वाली एक नई वस्तु बनाने के लिए आवंट विधि का उपयोग करें। मेरा मतलब यह है कि इसे

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], आप इस ऑब्जेक्ट के स्वामी बनें। आप इसे उपयोग करने के बाद, मान लीजिए कि

NSLog ("Url path is %@",url); 

आप इस वस्तु (यूआरएल)

[url release]; 

इस उद्देश्य सी

क्या अपने बयान के बारे में में स्मृति प्रबंधन के बारे में मुख्य विषय में से एक है जारी करना चाहिए,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

मुझे कहना पड़ेगा कि प्रणाली एक तार के साथ एक यूआरएल वापस आ जाएगी, लेकिन जो आपके स्वामित्व में नहीं है, तो आप इसे जारी करने की आवश्यकता नहीं है, क्योंकि इस प्रणाली स्वचालित रूप से इसे जारी करेंगे +alloc साथ

+1

@devcode, ठीक है, यह समझ में आता है, लेकिन मुझे लगता है कि मेरा अगला प्रश्न होगा, अगर आप "इसे स्वामित्व" करते हैं तो कभी भी परवाह क्यों न करें हमेशा आवंटन का उपयोग न करें और फिर इसे जारी करने के बारे में कभी चिंता न करें? यह आपको क्या खरीदता है? – gcoleman0828

+0

क्योंकि आपके पास ऑब्जेक्ट के साथ, आप अपने ऐप द्वारा उपयोग की गई मेमोरी को नियंत्रित कर सकते हैं। आप जानते हैं कि इस ऑब्जेक्ट का उपयोग करने के बाद, आपको सुविधाजनक कन्स्ट्रक्टर (जैसा आपने किया था) का उपयोग करके इसे रिलीज़ करना चाहिए, सिस्टम उस ऑब्जेक्ट को तत्काल रिलीज़ नहीं करता है, इसलिए आपके ऐप में अभी भी अनावश्यक स्मृति का एक ब्लॉक है। आवंटन का उपयोग नियम –

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