2009-10-16 20 views
6

में मैं एक वर्ग है कि इस तरह दिखता है:#typedef और KVC ObjC

@interface Properties : NSObject { 
@private 
    NSNumber* prop1; 
    NSNumberBool* prop2; 
    //etc 

जहां NSNumberBool एक typedef है:

// in MyApp_Prefix.pch 
typedef NSNumber NSNumberBool; 

मैं के लिए सभी आवश्यक @property और @synthesize घोषणाओं है prop1 और prop2 गुण बनाओ।

सब कुछ संकलित और ठीक काम किया जब तक कि मैंने [myProperties valueForKey: @ "prop2"] द्वारा prop2 तक पहुंचने का प्रयास नहीं किया। यह मुझे "वर्ग कुंजी-मूल्य अनुरूप नहीं है" त्रुटि देता है। हालांकि, कई समान कॉल ठीक काम करते हैं:

myProperties.prop2; //works 
[myProperties prop2]; //works 
[myProperties valueForKey:@"prop1"]; //works 
[myProperties valueForKey:@"prop2"] // throws NSUnknownKeyException ?? 

यहां क्या हो रहा है, और मैं इसे कैसे ठीक कर सकता हूं?

धन्यवाद,

+1

वास्तव में अजीब, एक ही मुद्दे में खुद चल रहा है।इसके अलावा यदि आप '[myProperties प्रतिसाद देता है तो चयनकर्ता: @ चयनकर्ता (prop2)]' यह YES के साथ-साथ – jjramos

उत्तर

1

यह एक पुरानी पोस्ट है, लेकिन मैं इस समस्या के समाधान की तलाश करते समय इसमें आया, जिसे उद्देश्य-सी 2.0 @compatibility_alias निर्देश द्वारा अच्छी तरह से हल किया गया है।

@compatibility_alias NSNumber NSNumberBool; 

और NSNumber के लिए बनाई गई एक अन्य नाम: यह आपको लिखने के लिए अनुमति देता है। केवीओ इसके साथ पूरी तरह से काम करता है।

वर्तमान में स्वीकृत उत्तर के बाद, इसका प्रकार-सुरक्षित होने का बड़ा लाभ है।

4

अपने उदाहरण के संकलन और उस पर class-dump जारी करने से, यह typedef

struct NSNumber { 
    Class _field1; 
}; 

@interface Properties : NSObject 
{ 
    NSNumber *prop1; 
    struct NSNumber *prop2; 
} 

में बदल गया हो रही है typedef को बदलने से इस अच्छा काम करने लगता है करने के लिए, प्रकट होता है, हालांकि हो सकता है वास्तव में नहीं क्या तुम्हें चाहिए।

#define NSNumberBool NSNumber 
+0

धन्यवाद देता है। अच्छी व्याख्या + सभ्य कामकाज – tba

4

मुझे संदेह है कि यह टाइपेडफ एन्कोड विधि के साथ इंटरैक्ट करने के तरीके के साथ एक मुद्दा है।

मेरा मानना ​​है कि टाइपिफ एक शुद्ध सी कीवर्ड बना हुआ है और वास्तव में केवल उद्देश्य-सी "प्रकारों" के साथ काम करने के लिए होता है क्योंकि उन्हें structs के रूप में लागू किया जाता है।

परिणामस्वरूप जब आप NSNumberBool को NSNumber टाइप करते हैं तो यह विधि कॉल (और डॉट सिंटैक्स गुणों) के लिए ठीक काम करता है लेकिन (मेरा सिद्धांत सही है) मानता है, एनकोड तोड़ता है जो यह नहीं बता सकता कि NSNumberBool और NSNumber एक ही प्रकार के हैं।

मुझे यह देखने में दिलचस्पी होगी कि जो कोई बेहतर जानता है वह कहता है।

1

नल के उत्तर के समान, मैंने कक्षा-डंप की भी कोशिश की। बदसूरत कामकाज अगर मुझे एक दिलचस्प लगता है। निम्नलिखित कोड:

typedef NSNumber* NSNumberBoolPtr; 

@interface Test : NSObject { 
    NSNumber *real; 
    NSNumberBoolPtr poser; 
} 

वर्ग उदासीनता के लिए:

@interface Test : NSObject 
{ 
    NSNumber *real; 
    NSNumber *poser; 
} 

@end 

फिर से, नहीं वास्तव में क्या आप चाहते हैं, लेकिन आप होने NSNumbers और एकदूसरे NSNumberBools नहीं की जाँच संकलक समय मिलेगा (जो मुझे लगता है पहली जगह में टाइपिफ़ का कारण)।

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