@ সাইনথেসাইজ বনাম @ অডিনামিক, পার্থক্যগুলি কী?


উত্তর:


744

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

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

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

সুপার ক্লাস:

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

উপশ্রেণী:

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

25
100% সঠিক নয়; ডায়ামিক ডিফল্ট যদি আপনি @ সংশ্লেষ বা @ydynic সেট না করেন। @dynamic নির্দিষ্ট করার অর্থ এই যে আপনি সম্পত্তি ঘোষণার স্বাক্ষরের উপর ভিত্তি করে সম্পত্তি অ্যাক্সেসরগুলি যথাযথভাবে প্রয়োগ করার জন্য দায়বদ্ধ হন।
কেভলার

68
আসলেই নয়, অ্যাক্সেসরগুলি বাস্তবায়নের দায়িত্বে @ অভিনেত্রীকে অর্পণ করা হয়। আপনি যদি ক্লাসের মধ্যেই অ্যাক্সেসরগুলি নিজেই প্রয়োগ করেন তবে আপনি সাধারণত @dynic ব্যবহার করবেন না।
মৃতেরখ

2
আমি লাইনটি NSUnknownKeyExceptionসরিয়ে দেওয়ার সময় আমি আমার গতিশীল সম্পত্তি নিয়ে ত্রুটিগুলি পেয়েছিলাম @synthesize(এক্সকোড ৩.২ আমাকে একটি ত্রুটি দিচ্ছিল বি / সি আমার @ প্রোপার্টিটির সাথে আমার কোনও মিল নেই ivar)। @dynamicসংশোধন করা সমস্যাটি সংযোজন - সংকলন এবং এখন দুর্দান্ত runs ধন্যবাদ!
pix0r

4
দুঃখিত, এটি পুরোপুরি ভুল buy @ আদনামিক বলে যে অ্যাক্সেসরগুলি রানটাইমের সময় সমাধান করা হয়, যদি না তারা ক্লাস বা সুপারক্লাসে ঘোষণা করা হয় (অন্য কোথাও নয়)। আপনি ডকুমেন্টেশন ডেভেলপার
app অ্যাপ্লিকেশন

5
কেভলার: না আধুনিক ObjC সালে @propertyআইটেম তন্ন তন্ন আছে @synthesizeকিংবা @dynamicস্বয়ং-সংশ্লেষিত হবে। প্রতিটি সম্পত্তির জন্য, একটি শীর্ষস্থানীয় আন্ডারস্কোর সহ আইভার _propertyNameতৈরি করা হবে, যথাযথ গেটর এবং সেটার সহ।
ডেভ আর

212

এই নিবন্ধটি একবার দেখুন ; "রানটাইম প্রদানের পদ্ধতি" শিরোনামে:

কিছু অ্যাক্সেসর রানটাইম সময়ে গতিশীলভাবে তৈরি করা হয়, যেমন কোরডাটার এনএস ম্যানেজডঅবজেক্ট ক্লাসে ব্যবহৃত নির্দিষ্ট কিছু। আপনি যদি এই কেসগুলির জন্য বৈশিষ্ট্যগুলি ঘোষণা করতে এবং ব্যবহার করতে চান তবে সংকলনের সময় অনুপস্থিত পদ্ধতিগুলি সম্পর্কে সতর্কতা এড়াতে চান, আপনি @ সংশ্লেষের পরিবর্তে @ নমুনা নির্দেশিকা ব্যবহার করতে পারেন।

...

@Dnamic নির্দেশাবলী ব্যবহার করে মূলত সংকলককে বলে "এটি সম্পর্কে চিন্তা করবেন না, একটি পদ্ধতি চলছে" "

@synthesizeনির্দেশক, অন্য দিকে, কম্পাইল মুহুর্তে আপনার জন্য অ্যাকসেসর পদ্ধতি উত্পন্ন (যদিও হিসাবে "মিক্সিং সংশ্লেষিত এবং কাস্টম Accessors" বিভাগে লক্ষনীয় এটা নমনীয় এবং যদি পারেন বাস্তবায়িত তোমার জন্য পদ্ধতি উৎপন্ন করে না)।


27
ইনি মোরির-সংশোধনকারী মানুষ। এই
উত্তরটিই

30

অন্যরা যেমন বলেছে, সাধারণভাবে আপনি সংকলকটি আপনার জন্য প্রযোজক এবং / অথবা সেটিংস তৈরি করতে এবং আপনি নিজেরাই লিখতে চলেছেন তবে @ সংজ্ঞায়িত ব্যবহার করুন

এখনও উল্লেখ করা হয়নি এমন আরও একটি সূক্ষ্মতা রয়েছে: @ সায়েন্টেসাইজ আপনাকে গেটর বা সেটার উভয়েরই একটি বাস্তবায়ন প্রদান করতে দেবে । এটি কার্যকর যদি আপনি কেবল কিছু অতিরিক্ত যুক্তির জন্য গেটর বাস্তবায়ন করতে চান তবে সংকলকটি সেটারটি তৈরি করতে দিন (যা সাধারণত নিজেকে লেখার ক্ষেত্রে কিছুটা জটিল)।

তবে, আপনি যদি @ সংশ্লেষিত অ্যাক্সেসরের জন্য একটি প্রয়োগ লিখে থাকেন তবে এটি অবশ্যই একটি বাস্তব ক্ষেত্রের দ্বারা সমর্থন করা উচিত (যেমন, আপনি যদি লিখেন তবে -(int) getFoo();আপনার অবশ্যই একটি int foo;ক্ষেত্র থাকতে হবে)। মানটি যদি অন্য কোনও কিছু দ্বারা উত্পাদিত হয় (উদাহরণস্বরূপ অন্যান্য ক্ষেত্রগুলি থেকে গণনা করা হয়) তবে আপনাকে @dynamic ব্যবহার করতে হবে।


2
গুরুত্বপূর্ণ পার্থক্যের উল্লেখের জন্য +1: @ মডেলামিক আপনাকে আপনার শ্রেণীর ইন্টারফেসে এবং অন্তর্নির্ধারণের মাধ্যমে সংজ্ঞায়িত নয় এমন ভার্যবেলের জন্য অ্যাকসেসর তৈরি করতে দেয়।
মাহবাউদজ

24
"এবং @dynamicআপনি যদি সেগুলি নিজেই লিখতে চলেছেন" না, আপনি নিজেরাই লিখলে আপনি গতিশীল ব্যবহার করবেন না। @dynamicআপনি তাদের প্রয়োগ করেছেন তা নিশ্চিত করতে সংকলক চেকিং বন্ধ করে দেয়। আপনি যদি এগুলি নিজে প্রয়োগ করেন তবে আপনি সংকলকটি চেক করতে চান।
ব্যবহারকারী 102008

14

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

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


14

এখানে @dynamic উদাহরণ

#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:"v@:@"];
    } 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;
}

10

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

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html

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

কিছুটা তদন্তের সাথে আমি জানতে পেরেছি যে অ্যাক্সেসর পদ্ধতি সরবরাহের ফলে @dynic নির্দেশিকা ওভাররাইড হয়ে যায়।

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

@ প্রপার্টি সংকলককে জানায় যে অ্যাকসেসরগুলি তৈরি করা হবে এবং এটি বিন্দু চিহ্নিতকরণ বা [বস্তুর বার্তা] দিয়ে অ্যাক্সেস করা যেতে পারে


6

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


আমি যদি কোনও বিভাগে কোনও সম্পত্তি সেটারকে ওভাররাইড করে এটিকে গতিশীল করে তুলি তবে এই গ্যারান্টিটি কি রানটাইম ব্যবহার করা হবে এবং প্যারেন্ট ক্লাসের সেটার নয়? অ্যাপল ডক্স থেকে: "যদি কোনও বিভাগে ঘোষিত কোনও পদ্ধতির নামটি মূল শ্রেণীর একটি পদ্ধতির মতো হয় ... রানটাইমে কোন পদ্ধতিটি প্রয়োগ করা হয় সে সম্পর্কে আচরণটি নির্ধারিত।"
ডেভিড জেমস

না, আমি মনে করি আচরণটি এখনও অপরিজ্ঞাত। বিভাগকে গতিশীল বিভাগে সম্পত্তি তৈরি করা সম্পত্তি সেটার পদ্ধতির রানটাইম অগ্রাধিকার পরিবর্তন করে না।
ইংপেপি জেং

3

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

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

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

অধিক তথ্য:-

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.