2009-09-06 15 views
9
@protocol Eating 
@end 

@interface Eat : NSObject<Eating> 
{ 
} 
- (id<Eating> *)me; 
@end 

@implementation Eat 
- (id<Eating> *)me { return self; } 
@end 

उद्देश्य-सी कोड के उपरोक्त हिस्से में, "स्वयं को वापस करने" का परिणाम "असंगत सूचक प्रकार से वापस" चेतावनी में क्यों होता है? असंगत सूचक प्रकार और इसे ठीक करने का तरीका क्या है?उद्देश्य-सी प्रोटोकॉल पागलपन - प्रोटोकॉल के आधार पर ऑब्जेक्ट कैसे वापस करें?

+1

@protocol खाने का उपयोग करें - यह आपको केवल उन तरीकों के बजाय उन वस्तुओं पर NSObject विधियों का उपयोग करने देगा। – Kornel

उत्तर

11

क्योंकि id एक सूचक ही है, आपको तारांकन की आवश्यकता नहीं है।

@interface Eat : NSObject<Eating> { 
} 
- (id<Eating>)me; 
@end 
+1

का उपयोग नहीं करते हैं, यह एक तारांकन है, एस्टरिक्स नहीं: http://en.wikipedia.org/wiki/Asterix;) (मुझे ले गया इस टिप्पणी को सही करने के लिए तीन बार!) – dreamlax

0

आईडी हटाएं * और आईडी के साथ प्रतिस्थापित करें। आईडी पहले से ही एक सूचक है।

1

ठीक है .. उत्तर "id *" के बजाय "id" है।

+0

आपको उन उत्तरों में से एक स्वीकार करना चाहिए जो आपको दिए गए थे। –

+0

क्यों डाउनवोट? उन्होंने इसे पहले के रूप में पोस्ट किया क्योंकि उन्होंने स्वयं को समस्या का सामना किया। –

0

आप अपने प्रयोग में बंद थोड़ा कर रहे हैं - यह है:

- (id<Eating>)me { return self; } 

(क्योंकि आप आईडी, नहीं एक वस्तु के लिए सूचक लौट रहे हैं)।

+0

** ऑब्जेक्ट ** और ** आईडी ** के पॉइंटर के बीच क्या अंतर है? –

+0

वास्तव में कोई नहीं है - यही कारण है कि आपका कोड काम नहीं करता है। (एनएसओब्जेक्ट *) और (आईडी) पहले से ही एक ही चीज़ हैं (वास्तव में नहीं बल्कि इस चर्चा के लिए काफी करीब है) इसलिए जब आप कहते हैं (आईडी *) यह कहने जैसा है (NSObject **)। हां यह थोड़ा अजीब बात है कि आईडी और क्लास दोनों ऑब्जेक्ट्स हैं जहां आप * ... –

1

क्योंकि id अनिवार्य रूप से NSObject * (हालांकि कुछ मामूली मतभेद हैं) है। इस प्रकार, जब आप self वापस करते हैं, तो आप -(NSObject *) लौट रहे हैं। आपके पास id * है जो NSObject ** जैसा है।

+2

'id'' struct objc_object * 'के लिए एक टाइपपीफ है, न कि' NSObject * '। अंतर महत्वपूर्ण है। – dreamlax

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