什么之间的差异,实施一个 @property@dynamic@synthesize?

有帮助吗?

解决方案

@synthesize会为你的财产getter和setter方法。 @dynamic只是告诉该获取和设置方法是由类本身不执行,但在其他地方(如超类或将在运行时提供)的编译器。

的用途@dynamic是例如与(CoreData)或NSManagedObject的亚类时要创建用于由未定义为出口的超类中定义的属性的出口。

也@dynamic可以用来委托执行访问器的责任。如果您在类中自己实现存取,那么你通常不使用@dynamic。

超类:

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

子类:

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

其他提示

看一看这篇文章;标题下的“在运行时提供方法”:

  

在运行时动态创建的某些存取器,如在CoreData的NSManagedObject类使用某一些。如果你想声明和使用性能对于这些情况,但要避免约在编译时失踪方法警告,可以使用@dynamic指令,而不是@synthesize。

     

...

     

使用@dynamic指令基本上告诉编译器“不担心,一种方法是在路上。”

@synthesize指令,另一方面,生成在编译时对于你的存取方法(虽然部分中的“搅拌合成和自定义存取器”如所指出它是柔性的,并且如果任一被实现为你不生成方法)

正如其他人所说,在一般使用@synthesize可以让编译器为您生成的getter和/或设置,如果@dynamic你要自己编写。

目前还没有提到的另一个微妙之处:@synthesize的将会的让你自己或者提供一个getter或setter方法的实现。如果你只想要实现一些额外的逻辑,吸气,但让编译器生成的setter(对于对象,通常是一个比较复杂写你自己),这非常有用。

但是,如果你写一个@的实现synthesize'd存取器必须仍然受到真正的现场备份(例如,如果你写-(int) getFoo();你必须有一个int foo;场)。如果该值是由别的东西产生(例如,来自其他字段来计算),那么必须使用@dynamic。

@动态是通常使用的(如上面已经说)当属性是被动态创建在运行时间。十分整洁不会这样(为什么其所有属性,是动态的)--其中禁止一些编译器的警告。

对于一个很好的概述有关如何创造性动态(不十分整洁和CoreData:见: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/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/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html

@dynamic告诉在运行时所提供的存取方法的编译器。

随着调查的一点点,我发现,提供存取方法覆盖@dynamic指令。

@synthesize告诉编译器创建这些存取你(getter和setter)

@属性告诉存取器将创建的编译器,以及可与所述点标记或访问[对象消息]

有一件事情想补充的是,如果一个属性被声明为@dynamic它不会占用内存(我与分配仪器确认)。结果是,你可以在类属财产申报。

<强> 作为每苹果文档。

您使用一个类的实现块@synthesize语句告诉编译器创建与您在@property声明给了规范,实施。

您使用@dynamic语句告诉编译器来抑制一个警告,如果无法找到由@property声明中指定的访问方法的实现。

<强> 更多信息: -

https://developer.apple。 COM /库/ IOS /文档/普通/概念/ DevPedia-CocoaCore / DeclaredProperty.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top