objective c - @ সিনথেসিজ বনাম @ ডাইনামিক, পার্থক্য কি?




objective-c cocoa (6)

@ @dynamic বা @synthesize @property দিয়ে @dynamic @property প্রয়োগের মধ্যে পার্থক্য কি?


@ ডাইনামিক সাধারণত ব্যবহার করা হয় (যেমন উপরে বলা হয়েছে) যখন কোনও সম্পত্তি রানটাইমতে গতিশীলভাবে তৈরি হচ্ছে। NSManagedObject এই (কেন তার সব বৈশিষ্ট্য গতিশীল হয়) - যা কিছু কম্পাইলার সতর্কতা suppresses।

গতিশীলভাবে সম্পত্তিগুলি কীভাবে তৈরি করবেন তার উপর একটি ভাল সারসংক্ষেপের জন্য (NSManagedObject এবং CoreData ছাড়া:, দেখুন: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1


@ সিনথেসিজ আপনার সম্পত্তিটির জন্য গেট্টার এবং সেট্টার পদ্ধতি তৈরি করবে। @ ডাইনামিক কেবল কম্পাইলারকে বলে যে গেট্টার এবং সেটার পদ্ধতিগুলি ক্লাস নিজেই নয় তবে অন্য কোথাও (সুপারক্লাসের মতো বা রানটাইম এ সরবরাহ করা হবে)।

@ ডায়নামিকের জন্য ব্যবহার করা হয় উদাহরণস্বরূপ NSManagedObject (CoreData) এর উপশ্রেণীগুলির সাথে অথবা যখন আপনি কোনও উপশ্রেণী হিসাবে সংজ্ঞায়িত কোনও সম্পত্তিটির জন্য আউটলেট তৈরি করতে চান যা আউটলেট হিসাবে সংজ্ঞায়িত করা হয় নি।

@ ডায়নামিক এছাড়াও অ্যাক্সেসার বাস্তবায়ন দায়িত্ব delegates ব্যবহার করা যেতে পারে। যদি আপনি শ্রেণির মধ্যে অ্যাক্সেসারগুলি নিজে প্রয়োগ করেন তবে আপনি সাধারণত @ ডাইনামিক ব্যবহার করেন না।

সুপার ক্লাস:

@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;

উপশ্রেণী:

@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;

এক জিনিস যোগ করতে চান যে যদি কোন সম্পত্তি @ ডাইনামিক হিসাবে ঘোষিত হয় তবে এটি মেমরি দখল করবে না (আমি বরাদ্দ যন্ত্রের সাথে নিশ্চিত)। ফলস্বরূপ আপনি শ্রেণী বিভাগে সম্পত্তি ঘোষণা করতে পারেন।


ডকুমেন্টেশন অনুযায়ী:

developer.apple.com/library/mac/documentation/cocoa/conceptual/…

@ ডাইনামিক কম্পাইলারকে বলে যে অ্যাক্সেসর পদ্ধতি রানটাইম এ সরবরাহ করা হয়।

কিছুটা তদন্তের মাধ্যমে আমি আবিষ্কার করেছি যে অ্যাক্সেসার পদ্ধতিগুলি @ ডাইনামিক নির্দেশনাকে ওভাররাইড করে।

@ সিনসথেসাইজ কম্পাইলারকে আপনার জন্য সেই অ্যাক্সেসারগুলি তৈরি করতে বলে (গেট্টার এবং সেট্টার)

@property কম্পাইলারকে বলে যে অ্যাক্সেসারগুলি তৈরি করা হবে, এবং এটি ডট নোটেশন বা [বস্তু বার্তা] দিয়ে অ্যাক্সেস করা যেতে পারে।


এখানে ডাইনামিক উদাহরণ

#import <Foundation/Foundation.h>

@interface Book : NSObject
{
   NSMutableDictionary *data;
}
@property (retain) NSString *title;
@property (retain) NSString *author;
@end

@implementation Book
@dynamic title, author;

- (id)init
{
    if ((self = [super init])) {
        data = [[NSMutableDictionary alloc] init];
        [data setObject:@"Tom Sawyer" forKey:@"title"];
        [data setObject:@"Mark Twain" forKey:@"author"];
    }
    return self;
}

- (void)dealloc
{
    [data release];
    [super dealloc];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
    NSString *sel = NSStringFromSelector(selector);
    if ([sel rangeOfString:@"set"].location == 0) {
        return [NSMethodSignature signatureWithObjCTypes:"[email protected]:@"];
    } else {
        return [NSMethodSignature signatureWithObjCTypes:"@@:"];
    }
 }

- (void)forwardInvocation:(NSInvocation *)invocation
{
    NSString *key = NSStringFromSelector([invocation selector]);
    if ([key rangeOfString:@"set"].location == 0) {
        key = [[key substringWithRange:NSMakeRange(3, [key length]-4)] lowercaseString];
        NSString *obj;
        [invocation getArgument:&obj atIndex:2];
        [data setObject:obj forKey:key];
    } else {
        NSString *obj = [data objectForKey:key];
        [invocation setReturnValue:&obj];
    }
}

@end

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

    Book *book = [[Book alloc] init];
    printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);
    book.title = @"1984";
    book.author = @"George Orwell";
    printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);

   [book release];
   [pool release];
   return 0;
}

অ্যাপল ডকুমেন্টেশন অনুযায়ী।

আপনি @property ঘোষণায় @property স্পেসিফিকেশনটির সাথে মেলে এমন বাস্তবায়নগুলি তৈরি করতে কম্পাইলারকে একটি ক্লাসের বাস্তবায়ন ব্লকের @synthesize বিবৃতিটি ব্যবহার করেন।

যদি আপনি @property ঘোষণা দ্বারা নির্দিষ্ট অ্যাক্সেসর পদ্ধতিগুলির বাস্তবায়ন খুঁজে না পান তবে কম্পাইলারকে সতর্কতা দমন করার জন্য আপনি @dynamic বিবৃতিটি ব্যবহার করেন।

অধিক তথ্য:-

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html





synthesize