2010-08-11 5 views
13

से NSObject reimplementing जब मैं नई 4.0.2 आईओएस अद्यतन मैं जानता हूँ कि हैकर्स क्या करना है या एक बफर अतिप्रवाह है, जो कुछ wikipedia'ing के बाद मुझे malloc साथ खेल रहे हैं और इस प्रकार बनाने में दिलचस्पी है के साथ क्या कर कोशिश करना चाहता था के बारे में पढ़ रहा था मेरा अपना "एनएसओब्जेक्ट"।खरोंच

मैं वास्तव में मेरी अनुप्रयोगों, में से किसी में इस का उपयोग करने की योजना बना नहीं कर रहा हूँ अपने ही सीखने और उद्देश्य-सी के साथ चारों ओर खेलने के लिए।

और निश्चित रूप से, जैसा कि अपेक्षित था, मुझे कुछ समस्याएं आईं जो मैं स्वयं को हल नहीं कर सका।

मेरी वस्तु बनाने के लिए

मुझे क्या करना:

+ (id)create{ return malloc(sizeof(self)); } 

और

- (void)free { free(self); } 

जब बुला [TestObject बनाने]; मुझे निम्नलिखित कंसोल संदेश मिलते हैं:

"8/11/10 11:17:31 अपराह्न परीक्षणिंग हेप [2675] *** एनएसआईएनवोकेशन: चेतावनी: ऑब्जेक्ट 0x100002100 वर्ग 'एओब्जेक्ट' का कार्यान्वयन नहीं करता है नोटर पहचानकर्ता चयनकर्ता: - निरस्त करें"

तो क्या यह मेरी वस्तु को एनएसओब्जेक्ट के रूप में संभालने की कोशिश कर रहा है ..? और मैं इसे कैसे हल करूं?

फाउंडेशन या ऐपकिट के बिना संकलन करते समय, मुझे विशेष रूप से गायब प्रतीकों, __objc_empty_vtable और __objc_empty_cache के लिए त्रुटि मिलती है। मैं कई हेडर फाइल सहित कोशिश की है से/usr/शामिल/ObjC/

अग्रिम धन्यवाद।

अद्यतन

libobjc साथ लिंक करने के बाद जब मेरी कक्षा से एक विधि कॉल करने की कोशिश कर रहा EXC_BAD_INSTRUCTION प्राप्त करते हैं।

+0

आप NSObject प्रोटोकॉल पर एक नज़र लेने के लिए, यदि आप पहले से नहीं है सकते हैं: http://developer.apple। कॉम/मैक/लाइब्रेरी/प्रलेखन/कोको/संदर्भ/फाउंडेशन/प्रोटोकॉल/एनएसओब्जेक्ट_Protocol/संदर्भ/NSObject.html – Justin

+0

हेडर फाइलों सहित, लापता-प्रतीकों की त्रुटियों को हल नहीं करेगा, जो लिंकर से आते हैं। आपको libobjc के खिलाफ लिंक करने की आवश्यकता है (आमतौर पर फाउंडेशन द्वारा आपके लिए किया गया)। –

+3

आप शायद 'sizeof (self)' का उपयोग कर आकार प्राप्त नहीं करना चाहते हैं। 'स्वयं' एक सूचक है, और इसलिए आपको पॉइंटर का आकार मिल जाएगा। आप इसके बजाए 'class_getInstanceSize' का उपयोग कर सकते हैं। – David

उत्तर

9

आप, sizeof के बजाय class_getInstanceSize उपयोग करने की आवश्यकता के रूप में डेविड ने बताया।

आप (के रूप में आप अपने आप को पता चला) libobjc के खिलाफ लिंक करना होगा।

आपकी बेस क्लास को isa पॉइंटर की आवश्यकता होती है जिसे आपके create विधि में सेट करना होगा।

और क्रम जो पहले अपने वर्ग पहली बार प्रयोग किया जाता है बुलाया जाएगा एक +initialize पद्धति लागू करने की आवश्यकता है। यदि यह गायब है तो यह दुर्घटनाग्रस्त हो जाता है।

तो सब बातों के साथ अपने आधार वर्ग कम से कम इस होना चाहिए:

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

@interface MyBase { 
    Class isa; 
} 

+ (id) alloc; 
- (void) free; 

@end 

@implementation MyBase 

+ (void) initialize; 
{ 
} 

+ (id) alloc; 
{ 
     size_t size = class_getInstanceSize(self); 
     MyBase *result = malloc(size ); 
     result->isa = self; 
     return result; 
} 

- (void) free; 
{ 
     free(self); 
} 

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