2009-05-11 10 views
18

से गुण सूची मैं कैसे की तरह एक ऑब्जेक्टिव-सी वर्ग के सभी गुण Objective-C 2.0 Runtime Programming Guide में वर्णित सूची करने की कोशिश की:ऑब्जेक्टिव-सी 2.0: class_copyPropertyList(), श्रेणियों

id LenderClass = objc_getClass("UIView"); 
unsigned int outCount, i; 
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount); 
for (i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property)); 
} 

लेकिन यह सूचीबद्ध करता है केवल तीन गुण:

userInteractionEnabled Tc,GisUserInteractionEnabled 
layer [email protected]"CALayer",R,&,V_layer 
tag Ti,V_tag 

UIView.h के लिए हेडर फ़ाइल को देखते हुए वे कक्षा में सीधे घोषित तीन गुण हैं। अन्य UIView गुण श्रेणियों के माध्यम से जोड़े जाते हैं।

श्रेणियों से आने वाले वर्ग सहित सभी वर्गों को मैं कैसे प्राप्त करूं?

मैंने इसे आईफोन सिम्युलेटर (आईफोन एसडीके 2.2.1), बीटीडब्ल्यू के साथ करने की कोशिश की। (यदि यह महत्वपूर्ण है)।

+0

शायद उन्हें गतिशील घोषित किया गया है और कैलियर के कारण संश्लेषित नहीं किया गया है? और इसलिए दिखाई नहीं दे रहा है? – hfossli

उत्तर

14

यहां मेरे परीक्षणों के आधार पर, class_copyPropertyList का उपयोग करते समय श्रेणियों से गुण दिखाए जाएंगे। ऐसा लगता है कि यूआईवी व्यू पर आप जो गुण देख रहे हैं वे केवल सार्वजनिक हेडर में गुणों के रूप में वर्णित हैं, वास्तव में UIKit को बनाने के दौरान इस तरह घोषित नहीं किया गया है। संभवतः उन्होंने सार्वजनिक हेडरों के निर्माण को थोड़ा तेज बनाने के लिए संपत्ति वाक्यविन्यास अपनाया।

संदर्भ के लिए, अपने परीक्षण परियोजना है:

#import <Foundation/Foundation.h> 
#import <objc/runtime.h> 

@interface TestClass : NSObject 
{ 
    NSString * str1; 
    NSString * str2; 
} 
@property (nonatomic, copy) NSString * str1; 
@end 

@interface TestClass (TestCategory) 
@property (nonatomic, copy) NSString * str2; 
@end 

@implementation TestClass 
@synthesize str1; 
@end 

@implementation TestClass (TestCategory) 

// have to actually *implement* these functions, can't use @synthesize for category-based properties 
- (NSString *) str2 
{ 
    return (str2); 
} 

- (void) setStr2: (NSString *) newStr 
{ 
    [str2 release]; 
    str2 = [newStr copy]; 
} 

@end 

int main (int argc, const char * argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    unsigned int outCount, i; 
    objc_property_t *properties = class_copyPropertyList([TestClass class], &outCount); 
    for (i = 0; i < outCount; i++) { 
     objc_property_t property = properties[i]; 
     fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property)); 
    } 

    [pool drain]; 
    return 0; 
} 

और यहाँ उत्पादन है:

str2 [email protected]"NSString",C 
str1 [email protected]"NSString",C,Vstr1 
+0

उत्तर के लिए बहुत बहुत धन्यवाद। ऐसा लगता है कि इस संबंध में UIKit के बारे में कुछ खास है। लेकिन आपका उदाहरण वास्तव में यह नहीं दिखाता है क्योंकि यह अपेक्षा के अनुसार काम करता है; यानी यह str2 प्रॉपर्टी को सूचीबद्ध करता है (जो कि मैं UIView के साथ मिलता हूं)। – ashcatch

+1

यही मेरा मतलब है, ऊपर। UIView के लिए सार्वजनिक शीर्षलेखों में घोषित गुणों को वास्तव में UIKit बनाने के लिए उपयोग किए जाने वाले स्रोत में गुणों के रूप में घोषित नहीं किया जाता है, इसलिए वे बाइनरी में ओबीजेसी रनटाइम जानकारी में वास्तव में संग्रहीत नहीं होते हैं। यानी गेटटर/सेटर विधियों का एक गुच्छा है, और सार्वजनिक शीर्षलेखों के लिए उन्होंने केवल अल्पसंख्यक के लिए विधि घोषणाओं के बजाय संपत्ति घोषणाएं जोड़ दी हैं। यदि वे वास्तव में गुण थे, तो वे class_copyPropertyList() के माध्यम से दिखाई देंगे, भले ही उन्हें श्रेणियों में घोषित किया गया हो। –

+3

आपको अंत में मुफ्त (गुण) पर कॉल करना चाहिए (दस्तावेज़ीकरण देखें)। – Sulthan

7

गुण हाँ, class_copyPropertyList समारोह वापसी करता श्रेणियों में परिभाषित किया।

यहां क्या हो रहा है, यह है कि यह केवल दिए गए वर्ग स्तर पर परिभाषित गुणों को लौटाता है - इसलिए आप केवल यूआईवीव में परिभाषित तीन गुणों को देख रहे हैं, और यूआईआरएसस्पोन्डर में परिभाषित गुणों (सामान्य या श्रेणी) में से कोई भी नहीं और एनएसओब्जेक्ट पूर्वजों।

पूर्ण विरासत सूची प्राप्त करने के लिए; आपको कक्षाओं के माध्यम से पूर्वजों के माध्यम से लूप करना होगा। सुपरस्क्लास संदर्भ और class_copyPropertyList से परिणामों को एकत्रित करना होगा। फिर आप देखेंगे, उदाहरण के लिए, NSObject के लिए UIKits एक्सेसिबिलिटी श्रेणी में परिभाषित विभिन्न गुण।

मैं वास्तव में को इन परिणामों से श्रेणियों में परिभाषित गुणों को बाहर करने के लिए यहां आया था!

+0

क्या आप श्रेणियों से संपत्तियों को बाहर करने का कोई तरीका ढूंढ रहे हैं? – devios1

+0

नहीं - मुझे नहीं लगता कि एक है।ऑब्जेक्टिव-सी रनटाइम लोड होने के बाद श्रेणियों से अनजान प्रतीत होता है, जो शायद संतुलन पर एक अच्छी बात है। मैं अपनी समस्या को हल करने के लिए एक और तरीका समाप्त हो गया। –

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