@综合vs@动态,有什么差异?
-
18-09-2019 - |
题
什么之间的差异,实施一个 @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;
}
作为每个文件:
@dynamic告诉在运行时所提供的存取方法的编译器。
随着调查的一点点,我发现,提供存取方法覆盖@dynamic指令。
@synthesize告诉编译器创建这些存取你(getter和setter)
@属性告诉存取器将创建的编译器,以及可与所述点标记或访问[对象消息]
有一件事情想补充的是,如果一个属性被声明为@dynamic它不会占用内存(我与分配仪器确认)。结果是,你可以在类属财产申报。
<强> 作为每苹果文档。 强>
您使用一个类的实现块@synthesize
语句告诉编译器创建与您在@property
声明给了规范,实施。
您使用@dynamic
语句告诉编译器来抑制一个警告,如果无法找到由@property
声明中指定的访问方法的实现。
<强> 更多信息: - 强>
https://developer.apple。 COM /库/ IOS /文档/普通/概念/ DevPedia-CocoaCore / DeclaredProperty.html