2011-09-26 13 views
19

मैं उद्देश्य-सी के बारे में शोध कर रहा हूं, और मैं जानना चाहता हूं कि इसमें प्रतिबिंब की अवधारणा है या नहीं। अब तक जो दस्तावेज मैंने पाया है उनमें से कोई भी प्रतिबिंब का वर्णन नहीं करता है।उद्देश्य-सी प्रतिबिंब है?

+0

देखें http://en.wikipedia.org/wiki/Objective-C –

+1

उद्देश्य-सी जावा की तुलना में अधिक शक्तिशाली प्रतिबिंब क्षमता है। आप [ऐप्पल के उद्देश्य-सी रनटाइम प्रोग्रामिंग गाइड] से अधिक जान सकते हैं। (Http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html#//apple_ref/doc/यूआईडी/टीपी 40008048) – venj

+0

धन्यवाद "ओटी" और "venj"। –

उत्तर

24

Runtime Reference में वर्णित रनटाइम फ़ंक्शंस हैं जो न केवल कक्षा या किसी उदाहरण की विशेषताओं के लिए पूछताछ की अनुमति देता है, बल्कि एक विधि जोड़ता है, या यहां तक ​​कि रनटाइम पर एक नई कक्षा भी बनाता है। मैं कहता हूं कि यह एक बहुत गतिशील प्रकार का प्रतिबिंब है, जो आमतौर पर सी-आधारित भाषाओं के लिए उपलब्ध नहीं था। Mike Ash's wrappers उसके आस-पास एक उद्देश्य-सी रैपर है। फिर, यह विधियों को भी जोड़ सकता है! कोको का बेस क्लास, NSObject, कई रनटाइम फ़ंक्शंस के लिए रैपर भी प्रदान करता है, NSObject protocol reference देखें। उदाहरण के लिए

 [foo respondsToSelector:@selector(bar:)]; 

    if([foo isKindOfClass:[NSString class]]){ ... } 

विधि नाम क्या कहते हैं। आप फ्लाई पर भी एक विधि जोड़ सकते हैं।उदाहरण के लिए,

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

    @interface Foo:NSObject 
    { 
    } 
    @end 
    @implementation Foo 
    -(void)sayHi 
    { 
     NSLog(@"Hi! from %@",NSStringFromSelector(_cmd)); 
    } 
    +(BOOL)resolveInstanceMethod:(SEL)sel 
    { 
     Method method=class_getInstanceMethod(self,@selector(sayHi)); 
     class_addMethod(self,sel,method_getImplementation(method),method_getTypeEncoding(method)); 
     return YES; 
    } 
    @end 

    int main(){ 
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
     Foo* foo=[[Foo alloc] init]; 
     [foo aeiou]; 
     [foo bark]; 
     [foo mew]; 
     [pool drain]; 
     return 0; 
    } 

यह आउटपुट का उत्पादन

Hi! from aeiou 
    Hi! from bark 
    Hi! from mew 

क्या यह करता है इस प्रकार है:

  1. SEL चर जो भेजे गए संदेश का प्रतिनिधित्व करता है (या विधि कॉल, अन्य शब्दावली।)
  2. उद्देश्य-सी रनटाइम किसी कक्षा के resolveInstanceMethod: कॉल करता है यदि किसी संदेश को भेजा गया संदेश लागू नहीं होता है कक्षा
  3. में nted, इसलिए, इस मामले में, मैं बस उस विधि के कार्यान्वयन के लिए sayHi नामक पूर्वनिर्धारित विधि के कार्यान्वयन की प्रतिलिपि बना रहा हूं।
  4. विधि से, आप विधि को कॉल करने में उपयोग किए गए चयनकर्ता को देखने के लिए _cmd का उपयोग कर सकते हैं। तो, यहां तक ​​कि एक sayHi कार्यान्वयन से भी, हम अलग-अलग आउटपुट प्राप्त कर सकते हैं।

कुछ मानक कोको के कार्यान्वयन (कुंजी-मूल्य-कोडिंग, कुंजी-मूल्य-निरीक्षण और विशेष रूप से कोर डेटा) कक्षा को गतिशील रूप से संशोधित करने के लिए रनटाइम का उपयोग करता है।

1

मुझे लगता है कि मुझे नहीं पता कि प्रतिबिंब के किस पहलू को आप ढूंढ रहे हैं। क्या आप यह निर्धारित करना चाहते हैं कि किसी दिए गए चर का कौन सा वर्ग है? यदि हां, तो यह बाहर की जाँच: Objective-C class -> string like: [NSArray className] -> @"NSArray"

// Get a object's class name 
if ([NSStringFromClass([foo class]) compare:@"NSSomeObject"] == NSOrderedSame) {...} 

// Does an object have a method 
[foo respondsTo:@selector(method:)] 

आप इस बस से अधिक के लिए देख रहे हैं?

+0

ओह! मेरे प्रबंधक को Objetive-C में सार कक्षा और प्रतिबिंब के बारे में शोध की आवश्यकता है। मैंने पता लगाने की कोशिश की लेकिन नतीजतन, इसलिए मुझे सभी से पूछना चाहिए :( पी/एस: बहुत बहुत धन्यवाद। –

+0

हू? क्या यह आपके काम से संबंधित है? आपको हमें अपने वेतन का हिस्सा चुकाना होगा :) – Yuji

+0

@ यूजी हेहे ठीक है: पी –

1

methods का एक झुंड है जो किसी वर्ग के विभिन्न गुणों तक पहुंच सकता है और संभवतः, कुछ वस्तु आंतरिक पर "चोटी" और "पोक" तक पहुंच सकता है। मैंने कभी उनके साथ नहीं खेला है, और मैंने जो कुछ पढ़ा है, वह सुझाव देता है कि वे बिल्कुल सही हैं, लेकिन वे जावा अवधारणा के समान "प्रतिबिंब" की कुछ क्षमता प्रदान करते हैं।

+0

बहुत बहुत धन्यवाद :) –

+0

क्या आपको कोई विचार है कि वास्तविक संपत्ति को कैसे प्रतिबिंबित करने के बाद इसे प्राप्त किया जाए? मेरे यहां एक प्रश्न है: http://stackoverflow.com/q/25538890/1735836 – Patricia

11

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

उद्देश्य-सी में प्रतिबिंब एक सी व्युत्पन्न भाषा के लिए आश्चर्यजनक रूप से लचीला है। आप कक्षा से पूछ सकते हैं कि यह कौन सी विधियों को लागू करता है या आप मौजूदा वर्गों में विधियों को संशोधित और/या जोड़ सकते हैं। आप फ्लाई पर नए वर्ग भी बना सकते हैं या किसी भी समय किसी भी इंस्टेंस की कक्षा बदल सकते हैं।

एक ठेठ ऑब्जेक्टिव-सी कार्यक्रम शोध करे बातें में से कोई भी करता है (कम से कम नहीं सीधे) कभी-कभी बुला respondsToSelector: या conformsToProtocol: को बचाने के लिए। जबकि उद्देश्य-सी पूरी तरह गतिशील, प्रतिबिंबित, ऑब्जेक्ट उन्मुख भाषा है, इसका मतलब यह नहीं है कि इस तरह के पैटर्न को प्रोत्साहित किया जाता है या आमतौर पर उपयोग किया जाता है।

आपको इन प्रश्नों दिलचस्प करने के लिए अपने जवाब मिल सकता है:

In Objective C, how to find out the return type of a method via reflection?

Does Objective-C have a Standard Library?

Smalltalk runtime features absent on Objective-C?

और, बेशक, क्रम very well documented है। जैसा कि the language है। या आप read the source कर सकते हैं।

+0

क्या आपको कोई विचार है कि वास्तविक संपत्ति को कैसे प्रतिबिंबित करने के बाद इसे प्राप्त किया जाए? मेरे यहां एक प्रश्न है: http://stackoverflow.com/q/25538890/1735836 – Patricia