سؤال

ما هي الاختلافات بين تنفيذ @property مع @dynamic أو @synthesize?

هل كانت مفيدة؟

المحلول

Synthesize سيؤدي إلى إنشاء طرق Getter و Setter لممتلكاتك. يخبر Thnnamic فقط المترجم الذي يتم فيه تطبيق أساليب Getter و Setter من خلال الفصل نفسه ولكن في مكان آخر (مثل Superclass أو سيتم توفيره في وقت التشغيل).

الاستخدامات ل Tynamic هي على سبيل المثال مع الفئات الفرعية من NSManagedObject (Coredata) أو عندما ترغب في إنشاء منفذ لممتلكات محددة بواسطة Superclass لم يتم تعريفها كمنفذ.

يمكن أن تستخدم LeNamic أيضا لتفويض مسؤولية تنفيذ الملاعبين. إذا قمت بتطبيق OPSORS بنفسك داخل الفصل، فأنت عادة لا تستخدمDYNAMIC.

فئة سوبر:

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

Subclass:

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

نصائح أخرى

إلقاء نظرة على هذه المقالة; ؛ تحت عنوان "الأساليب المقدمة في وقت التشغيل":

يتم إنشاء بعض المسافرين ديناميكيا في وقت التشغيل، مثل معينة منها المستخدمة في فئة NSManagedobject في Coredata. إذا كنت ترغب في إعلان واستخدام الخصائص لهذه الحالات، ولكنك ترغب في تجنب التحذيرات حول الأساليب المفقودة في وقت الترجمة، فيمكنك استخدام التوجيه Lynamic بدلا من Synthesize.

...

يؤدي استخدام التوجيه Lynamic بشكل أساسي إلى التحويل البرمجي "لا تقلق بشأنه، طريقة في الطريق".

ال @synthesize بالتوجيه، من ناحية أخرى، يولد أساليب الملحقات لك عند تجميع الوقت (على الرغم من الإشارة في قسم "خلط التوصيل والمستطيلات المخصصة"، فإنه مرن ولا يولد طرقا لك إذا تم تنفيذ إما).

كما قال آخرون، بشكل عام، يمكنك استخدام Synthethesize للحصول على برنامج التحويل البرمجي إنشاء Getters و / أو الإعدادات لك، و Lynamic إذا كنت ستكتب إليهم بنفسك.

هناك مزعج آخر لم يذكر بعد: snthesize إرادة تتيح لك تقديم تطبيق بنفسك إما من Getter أو Stredter. هذا مفيد إذا كنت ترغب فقط في تطبيق Getter للحصول على بعض المنطق الإضافي، ولكن السماح للمترجم بإنشاء STERTER (الذي، للكائنات، عادة ما يكون أكثر تعقيدا قليلا لكتابة نفسك).

ومع ذلك، إذا قمت بالكتابة بتنفيذ Accessor Accessor @، فلا يزال يتعين على الحقل الحقيقي (على سبيل المثال، إذا كتبت -(int) getFoo(); يجب أن يكون لديك int foo; حقل). إذا كانت القيمة تنتج من قبل شيء آخر (على سبيل المثال محسوبة من الحقول الأخرى)، فعليك استخدامDynamic.

يستخدمDynamic عادة (كما قيل أعلاه) عندما يتم إنشاء خاصية ديناميكيا في وقت التشغيل. nsmanagedobject هل هذا (لماذا خصائصها ديناميكية) - التي تقمع بعض التحذيرات المترجم.

للحصول على نظرة عامة جيدة حول كيفية إنشاء خصائص ديناميكيا (بدون nsmanagedobject و Coredata:، انظر: http://developer.apple.com/library/ios/#Documentation/cocoa/coneperual/opjcruntimeguide/opjcruntimeguide/opacticles/ocrtdynamicresolution.html#//apple_ref/doc/uid/tp40008048-ch102-sw1.

هنا مثال على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;
}

وفقا للوثائق:

https:/developer.apple.com/library/mac/documentation/cocoa/conectual/objcruntimeguide/articles/ocrtdynamicresolution.html.

Thnnamic يخبر التحويل البرمجي الذي يتم توفير أساليب الملحقات عند وقت التشغيل.

مع القليل من التحقيقات، اكتشفت أن توفير طرق الملحق يتجاوز التوجيه Lynamic.

synthesize يحكي المحول البرمجي لإنشاء تلك الملاءمة لك (getter و setter)

throperty يروي المحول البرمجي الذي سيتم إنشاؤه، ويمكن الوصول إلى ذلك مع نقطة تدوين DOT أو [رسالة كائن

هناك شيء واحد يريد أن يضيف هو أنه إذا تم الإعلان عن خاصية كما Lynamic، فلن يشغل الذاكرة (أكدت مع أداة التخصيص). والنتيجة هي أنه يمكنك إعلان الملكية في فئة الطبقة.

حسب وثائق Apple.

أنت تستخدم @synthesize بيان في كتلة تنفيذ الفصل لإخبار المحول البرمجي بإنشاء تطبيقات تتوافق مع المواصفات التي قدمتها في @property إعلان.

أنت تستخدم @dynamic بيان لإخبار المترجم بالقمع تحذير إذا لم يتمكن من العثور على تنفيذ أساليب الملحق المحددة من قبل @property إعلان.

مزيد من المعلومات:-

https:/developer.apple.com/library/ios/documentation/general/coneptual/devpedia-cocoacore/declaredproperty.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top