2013-03-23 4 views
6

मैं फाउंडेशन के बिना एक सरल उद्देश्य सी प्रोग्राम बनाना चाहता हूं। मैंने कोशिश की:फाउंडेशन के बिना एक नई वस्तु कैसे आवंटित करें?

#include <stdio.h> 

@interface Foo{ 
    char * bar; 
} 
-(void)hello; 
@end 

@implementation Foo 
-(void)hello { 
    printf("Hello world!"); 
} 
@end 

int main(){ 
    Foo * foo = [Foo alloc]; 
    return 0; 
} 

तो यह मुझसे कहता है Foo may not respond to +alloc और autorelease called without pool ...

मैं कैसे फाउंडेशन से alloc का उपयोग किए बिना एक वस्तु को प्रारंभ कर सकते हैं?

+2

आप फाउंडेशन का उपयोग करने से क्यों बचना चाहते हैं? – occulus

+0

@ ऑकुलस क्योंकि मैं सी ++ के विकल्प के रूप में उद्देश्य सी का उपयोग करना चाहता हूं और मै मैक ओएस – texasbruce

+2

@texasbruce नहीं चला रहा हूं फिर GNUStep के रनटाइम का उपयोग करें। (प्लेटफ़ॉर्म की बिल्कुल व्यावहारिक पसंद नहीं है लेकिन यह 'NSObject' को पुन: पेश करने की कोशिश करने से बेहतर काम करेगा।) – millimoose

उत्तर

9

फाउंडेशन से alloc का उपयोग किये बिना एक नया ऑब्जेक्ट बनाना बहुत आसान है। उद्देश्य-सी रनटाइम लाइब्रेरी स्वयं फ़ंक्शंस प्रदान करती है जो किसी को कक्षाओं से वस्तुओं को आवंटित करने और बाद में उन्हें आवंटित करने की अनुमति देती है, ताकि आपको वस्तुओं को बनाने और नष्ट करने के लिए कोई अतिरिक्त लाइब्रेरी की आवश्यकता न हो।

फ़ंक्शन id class_createInstance(Class cls, size_t extraBytes) एक क्लास ऑब्जेक्ट प्राप्त करता है, जिसमें से एक नई ऑब्जेक्ट आवंटित करने के लिए, और एक पूर्णांक, जो लगभग हमेशा शून्य होता है, और cls का एक नया उदाहरण देता है।

इसी तरह, फ़ंक्शन id object_dispose(id obj) एक उद्देश्य-सी ऑब्जेक्ट लेता है, प्रत्येक सी ++ ऑब्जेक्ट इंस्टेंस वैरिएबल के सी ++ विनाशक को कॉल करता है, मौजूदा संबंधित संदर्भों को हटा देता है और इसे मुक्त करता है।

class_createInstance और object_dispose दोनों /usr/include/objc/runtime.h में घोषित किए गए हैं।

तो, आप अपने +alloc और -dealloc विधियों को लागू कर सकते हैं।आपका कार्यक्रम इस प्रकार दिखाई देगा:

#include <stdio.h> 
#include <objc/runtime.h> 

@interface Foo{ 
    char * bar; 
} 
+(id)alloc; 
-(void)hello; 
@end 

@implementation Foo 
+(id)alloc { 
    // Returns a new 'Foo' object. In this case, 'self' is a 'Foo' class object, 
    // whose type is 'Class', as required by `class_createInstance`. 
    return class_createInstance(self, 0); 
} 
-(void)dealloc { 
    object_dispose(self); 
} 
-(void)hello { 
    printf("Hello world!"); 
} 
@end 

int main(){ 
    Foo *foo = [Foo alloc]; 
    [foo hello]; 
    [foo dealloc]; 

    return 0; 
} 

यह संकलित रूप में आप सामान्य रूप से कार्य करें:

gcc Foo.m -o Foo -lobjc 

सब है कि!

+0

मैंने runtime.h में देखा, और पाया: किसी ऑब्जेक्ट को नष्ट करने के लिए, अगर कोई पूछता है तो 'object_dispose (obj)' का उपयोग करें। – texasbruce

+0

अच्छी तरह से याद किया, @texasbruce। – LuisABOL

1

आप फाउंडेशन के बिना उद्देश्य सी लिख सकते हैं, लेकिन निश्चित रूप से आप कुछ डिग्री तक व्हील का पुन: आविष्कार कर सकते हैं।

चूंकि मिलीमोज़ सुझाव देता है, आप GNUStep Objective C runtime का उपयोग कर सकते हैं।

अधिक जानकारी के लिए, देखें:

+0

मैंने 'ऑब्जेक्ट.h' के साथ पहले व्यक्ति की कोशिश की लेकिन यह अभी भी मुझे बताता है कि आवंटन विधि परिभाषित नहीं की गई है ... मुझे लगता है कि मुझे NSObject का उपयोग करना होगा, फिर – texasbruce

0

आप alloc को परिभाषित नहीं है, क्योंकि आप NSObject से विरासत नहीं है जो नींव का हिस्सा है।

यहाँ मामलों में दो हैं:

  1. आपको लगता है कि नींव बुराई है, या किसी कारणवश आप इसका इस्तेमाल नहीं कर सकते हैं के लिए।
  2. आप इसे व्यायाम के लिए कर रहे हैं।

यदि आप दूसरे मामले में नहीं हैं, और न तो किसी विशेष मामले में जो नींव का उपयोग करना असंभव बनाता है, तो मैं आपकी पसंद पर पुनर्विचार करता हूं।

हालांकि यदि आप नींव का उपयोग नहीं करना चाहते हैं, तो आवंटित आइस पॉइंटर के साथ ऑब्जेक्ट को वापस लेना चाहिए।

+0

यह भी सुनिश्चित करें कि आपने टैग पॉइंटर और छोटी ऑब्जेक्ट्स का ख्याल रखा है कस्टम आवंटन आपके रनटाइम आपको क्या देता है इसका उपयोग करना बेहतर है। यह जरूरी नहीं है कि वस्तुओं का खुलासा होना चाहिए या आईएसए होना चाहिए। –

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