it-swarm.asia

@ synthesize vs @dynamic, farklar nelerdir?

@property ile @dynamic veya @synthesize uygulaması arasındaki farklar nelerdir?

549
nico

@ synthesize mülkünüz için alıcı ve belirleyici yöntemler üretecektir. @dynamic, derleyiciye alıcı ve ayarlayıcı yöntemlerinin sınıfın kendisi tarafından değil başka bir yerde de (süper sınıf gibi veya çalışma zamanında sağlanacağını) uygulandığını söyler.

@Dynamic için kullanımlar örn. NSManagedObject (CoreData) alt sınıfları ile veya çıkış olarak tanımlanmayan bir üst sınıf tarafından tanımlanan bir özellik için bir çıkış oluşturmak istediğinizde.

@dinamik, erişimcileri uygulama sorumluluğunu devretmek için de kullanılabilir. Erişimcileri sınıf içinde kendiniz uygularsanız normalde @dinamik kullanmazsınız.

Süper sınıf:

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

Alt sınıf:

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

Bir göz atın bu makale ; "Çalışma zamanında sağlanan yöntemler" başlığı altında:

Bazı erişimciler, CoreData'nın NSManagedObject sınıfında kullanılanlar gibi, çalışma zamanında dinamik olarak oluşturulur. Bu durumlar için özellikler bildirmek ve kullanmak, ancak derleme zamanında eksik olan yöntemlerle ilgili uyarılardan kaçınmak istiyorsanız, @synthesize yerine @dynamic direktifini kullanabilirsiniz.

...

@Dynamic direktifin kullanılması temel olarak derleyiciye “endişelenmeyin, bir yöntem yolda” olduğunu söyler.

Öte yandan, @synthesize yönergesi, derleme zamanında sizin için erişimci yöntemlerini oluşturur ("Sentezlenmiş ve Özel Erişimcilerin Karıştırılması" bölümünde belirtildiği gibi, esnek olmasına rağmen, ya da uygulandığında sizin için yöntem oluşturmaz) ).

211
Alex Rozanski

Diğerlerinin de dediği gibi, genel olarak derleyicinin sizin için alıcı ve/veya ayarları oluşturmasını sağlamak için @sentezize, ve eğer kendiniz yazacaksanız @ dinamik.

Henüz belirtilmeyen başka bir incelik daha var: @synthesize will Bir alıcı veya ayarlayıcı için kendiniz bir uygulama sunmanıza izin verin. Bu, yalnızca alıcıyı bazı ekstra mantıklara uygulamak istiyorsanız, ancak derleyicinin ayarlayıcıyı üretmesine izin verin (nesneler için genellikle kendiniz için biraz daha karmaşıktır).

Bununla birlikte, @ sentezleyici bir erişimci için bir uygulama yazarsanız, yine de gerçek bir alan tarafından desteklenmelidir (örneğin, -(int) getFoo(); yazarsanız, bir int foo; alanı olmalıdır). Değer başka bir şey tarafından üretiliyorsa (örneğin, diğer alanlardan hesaplanmışsa) @dinamik kullanmanız gerekir.

29
philsquared

burada @dynamic örneği

#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;
}
14
mirror

@dinamik tipik olarak (yukarıda belirtildiği gibi) bir özellik çalışma zamanında dinamik olarak yaratılırken kullanılır. NSManagedObject bunu yapar (neden tüm özelliklerinin dinamik olduğunu) - bazı derleyici uyarılarını bastırır.

Özelliklerin dinamik olarak nasıl oluşturulacağına dair iyi bir genel bakış için (NSManagedObject ve CoreData olmadan :, bakınız: http://developer.Apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution). html # // Apple_ref/doc/uid/TP40008048-CH102-SW1

14
mifortin

Belgelere göre:

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

@dynamic derleyiciye, çalışma zamanında erişimci yöntemlerinin sağlandığını söyler.

Biraz araştırma yaparak erişim metodu sağlamanın @dinamik yönergeyi geçersiz kıldığını öğrendim.

@synthesize, derleyiciye bu erişimcileri sizin için yaratmasını söyler (alıcı ve belirleyici)

@property, derleyiciye erişimcilerin oluşturulacağını ve nokta gösterimi veya [nesne mesajı] ile erişilebileceğini söyler

10
user1447414

Eklemek istediğim şey, bir özellik @ dinamik olarak bildirildiğinde hafızayı meşgul etmeyeceğidir (tahsis aracıyla onayladım). Bunun bir sonucu olarak sınıf kategorisinde mülk ilan edebilirsiniz.

6
Yingpei Zeng

Apple belgelerine göre.

Derleyiciye @synthesize bildiriminde verdiğiniz belirtimle eşleşen uygulamalar oluşturmasını söylemek için bir sınıfın uygulama bloğundaki @property ifadesini kullanırsınız.

@dynamic deyimini, derleyiciye bir @property bildirimi tarafından belirtilen erişim yöntemlerinin bir uygulamasını bulamadığı takdirde bir uyarıyı bastırmasını önlemek için kullanırsınız.

Daha fazla bilgi: -

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

1
arango_86