2011-06-08 5 views
8

मैं सरल कोड लाइन प्रोग्राम में कुछ कोड के साथ खेलकर उद्देश्य-सी सीख रहा हूं, यहां मेरा कोड है:क्या उद्देश्य-सी कमांड लाइन प्रोग्राम को NSAutoreleasePool की आवश्यकता होती है?

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main(int argc, char** argv) 
{ 
    NSString *hello = @"hello world"; 

    printf("msg: %s\n", [hello UTF8String]); 

    return 0; 
} 

मैं संकलित करता हूं और इसे इस तरह चलाता हूं:

gcc test.m -o test -ObjC -framework Foundation 
./test 

और प्राप्त करें निम्नलिखित आउटपुट:

2011-06-08 20:35:21.178 test[10220:903] *** __NSAutoreleaseNoPool(): Object 
0x10010c8b0 of class NSCFData autoreleased with no pool in place - just leaking 
msg: hello world 

तो मैं देख सकता हूं कि त्रुटि इस तथ्य का जिक्र कर रही है कि कोई NSAutoreleasePool नहीं है, और जब मैं एक जोड़ता हूं, तो त्रुटि दूर हो जाती है:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main(int argc, char** argv) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSString *hello = @"hello world"; 

    printf("msg: %s\n", [hello UTF8String]); 

    [pool release]; 

    return 0; 
} 

तो क्या मैं सही हूँ यह मानते हुए कि एक कमांड लाइन एप्लिकेशन जो एनएसएसटींग आदि जैसी वस्तुओं का उपयोग करता है और फाउंडेशन के खिलाफ संकलित करने के लिए मैन्युअल रूप से एक ऑटो रिलीज पूल बनाया जाना आवश्यक है? और यह मेरा उदाहरण है इसे करने का सबसे अच्छा तरीका है?

नोट: मैंने भी [हैलो रिलीज] करने की कोशिश की; NSAutoreleasePool के बिना यह देखने के लिए कि क्या मैं पूल का उपयोग किये बिना मेमोरी को मैन्युअल रूप से साफ़ कर सकता हूं, लेकिन एक ही समस्या है।

उत्तर

9

हाँ, और हाँ।

कोको (जीयूआई या फाउंडेशन फॉर्म में) एक ऑटोरेलीज पूल मौजूद होने की अपेक्षा करता है; ढांचे के आंतरिक (केवल अपना कोड नहीं) -autorelease संदेश और पूल का उदार उपयोग करते हैं, और यदि आपके पास ऑटोरेलीज पूल स्टैक पर कोई पूल नहीं है, तो यह शिकायत करेगा, और वस्तुओं को रिसाव करेगा, जैसा कि आप 'देखा है।

मुझे लगता है कि आपके पास कचरा संग्रह बंद है; मैंने इसके साथ कभी विकसित नहीं किया है, लेकिन उस मामले में मैं कल्पना कर सकता हूं कि आपको इसकी आवश्यकता नहीं होगी।

अद्यतन autorelease पूल अब एक @autoreleasepool {...} ब्लॉक, जो एक ही प्रभाव पड़ता है, और क्षमता सिर्फ कूद/इसे से बाहर वापस जाने के लिए जैसे कुछ अच्छा बोनस का उपयोग कर बनाया जा सकता है।

+0

धन्यवाद, स्पष्ट स्पष्टीकरण और पुष्टि की है कि मैं सही लाइनों पर हूं :) – Martin

+1

यदि आप जानते हैं कि आप कभी भी ऑटोरेलीज्ड विधि नहीं कहते हैं (उदाहरण के लिए आप हमेशा स्पष्ट रूप से 'आवंटित', 'init', और ' अपने ऑब्जेक्ट्स को रिलीज़ करें), लेकिन यह बेहद दुर्लभ है और खिलौनों के कार्यक्रमों में बहुत अधिक होता है जो कभी भी लाइब्रेरी फ़ंक्शंस को कॉल नहीं करते हैं। –

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