मैं सरल कोड लाइन प्रोग्राम में कुछ कोड के साथ खेलकर उद्देश्य-सी सीख रहा हूं, यहां मेरा कोड है:क्या उद्देश्य-सी कमांड लाइन प्रोग्राम को 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 के बिना यह देखने के लिए कि क्या मैं पूल का उपयोग किये बिना मेमोरी को मैन्युअल रूप से साफ़ कर सकता हूं, लेकिन एक ही समस्या है।
धन्यवाद, स्पष्ट स्पष्टीकरण और पुष्टि की है कि मैं सही लाइनों पर हूं :) – Martin
यदि आप जानते हैं कि आप कभी भी ऑटोरेलीज्ड विधि नहीं कहते हैं (उदाहरण के लिए आप हमेशा स्पष्ट रूप से 'आवंटित', 'init', और ' अपने ऑब्जेक्ट्स को रिलीज़ करें), लेकिन यह बेहद दुर्लभ है और खिलौनों के कार्यक्रमों में बहुत अधिक होता है जो कभी भी लाइब्रेरी फ़ंक्शंस को कॉल नहीं करते हैं। –