@dynamic 使用的常见情况是啥?

Posted

技术标签:

【中文标题】@dynamic 使用的常见情况是啥?【英文标题】:What is common case for @dynamic usage?@dynamic 使用的常见情况是什么? 【发布时间】:2011-05-30 07:47:53 【问题描述】:

之前有post@synthesize 和@dynamic 的区别。

我想从通常如何使用@dynamic 的角度了解更多关于动态的信息。

通常我们将@dynamic 与 NSManagedObject 一起使用

// Movie.h
@interface Movie : NSManagedObject 

@property (retain) NSString* title;
@end

// Movie.m
@implementation Movie
@dynamic title;
@end

根据@dynamic的理解,实际上编译时并没有生成getter/setter,所以需要自己实现getter/setter。

我的问题是,在这个 NSManagedObject 案例中,超类 NSManagedObject 中 getter/setter 的粗略实现是什么?

除了上述情况,还有多少其他情况可以使用@dynamic?

谢谢,

【问题讨论】:

正如贾斯汀已经说过的,关键是@dynamic 明确停止编译器使其成为自己的访问器。如果您没有@dynamic(即,如果您一无所有),则当天“任何事情都可能发生”,有不同的版本,等等。 【参考方案1】:

@dynamic 向编译器表明您计划为访问器提供自己的实现,即使编译器当前看不到它们。如果您省略@dynamic 并且不使用@synthesize,则会发生以下两种情况之一:

    如果您只提供了一半的访问器(例如,在 readwrite 属性上没有设置器的 getter),或者您正在使用 GCC,编译器会警告您。 如果您使用 Clang 编译代码,将自动为您生成正确的访问器。(不支持默认合成。)

@dynamic 因此对于防止编译器执行上述任一操作很有用。如果您以非常动态的方式(例如使用运行时函数)实现属性,这也可能会派上用场,但这很少需要。

【讨论】:

抱歉,这是一个实验性功能,他们已经删除了。合成属性现在需要一个显式的@synthesize。我会更新我的答案。 我认为你可以恢复你的#2点。现在默认合成属性 afaik(另见 ***.com/q/11666008/6827)

以上是关于@dynamic 使用的常见情况是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的dynamic-insert和dynamic-update的使用

Flutter:类型 'Future<dynamic>' 不是类型 'Widget' 的子类型 // MaterialPageRoute<dynamic>(null))

类型 'List<dynamic>' 不是类型 'Map<String, dynamic>' 的子类型在颤振应用程序中出现此错误

Flutter-Firestore “参数类型 'Map<String, dynamic> Function()' 不能分配给参数类型 'Map<String, dynamic>

将 UIKit Dynamics 添加到 UICollectionViewCells 的正确方法是啥?

eclipse建web工程的dynamic web module version 是啥意思?