Objective-C使用@dynamic和@synthesize

本文详细解释了Objective-C中@dynamic修饰符的含义及其使用场景,包括如何告知编译器属性的getter和setter方法将在别处实现,以及@dynamic在NSManagedObject中的具体应用。

 

@dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 getter,对于读写属性需要提供 getter 和setter。
@synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。

查阅了一些资料确定@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自己实现,不自动生成。
@dynamic just tells the compiler that the getter and setter methodsare implemented not by the class itself but somewhere else (likethe superclass)

再看苹果官方文档说明似乎更有意思 :

动态方法解析 有时候,您需要动态地提供一个方法的实现。例如,Objective-C中属性(Property)(参考Objective-C2.0 程序设计语言中属性小节)前的修饰符 @dynamic @dynamic propertyName;表示编译器须动态地生成该属性对应地方法。 您可以通过实现resolveInstanceMethod:和resolveClassMethod:来动态地实现给定选标的对象方法或者类方法。 Objective-C方法可以认为是至少有两个参数——self和_cmd——的C函数。您可以通过class_addMethod方法将一个函数加入到类的方法中。例如,有如下的函数: void dynamicMethodIMP(id self, SEL _cmd) {    // implementation….}您可以通过resolveInstanceMethod:将它作为类方法resolveThisMethodDynamically的实现: @implementation MyClass+ (BOOL)resolveInstanceMethod:(SEL)aSEL{    if (aSEL ==@selector(resolveThisMethodDynamically)) {          class_addMethod([self class],aSEL, (IMP) dynamicMethodIMP, "v@:");         return YES;    }    return [superresolveInstanceMethod:aSEL];}@end通常消息转发(见“消息转发”)和动态方法解析是互不相干的。在进入消息转发机制之前,respondsToSelector:和instancesRespondToSelector:会被首先调用。您可以在这两个方法中为传进来的选标提供一个IMP。如果您实现了resolveInstanceMethod:方法但是仍然希望正常的消息转发机制进行,您只需要返回NO就可以了。

在Aaron Hillegass写的Cocoa programming for Mac OSX中30章的Department.m中也运用了Dynamic方法,即Key-Value Coding方法实现的。

 

@dynamic
就是要来告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManageObject对象的属性声明上,由于此类对象的属性一般是从Core
Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和Setter方法。

 

转载于:https://my.oschina.net/qianming190729717/blog/161901

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值