@dynamic和@synthesize使用方法

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

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

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

动态方法解析

有时候,您需要动态地提供一个方法的实现。例如,Objective-C中属性(Property)(参考Objective-C 2.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 [super resolveInstanceMethod:aSEL];
}
@end
通常消息转发(见 “消息转发”)和动态方法解析是互不相干的。在进入消息转发机制之前,respondsToSelector:和 instancesRespondToSelector: 会被首先调用。您可以在这两个方法中为传进来的选标提供一个IMP。如果您实现了resolveInstanceMethod:方法但是仍然希望正常的消 息转发机制进行,您只需要返回NO就可以了。
在Aaron Hillegass写的Cocoa programming for Mac OS X中30章的Department.m中也运用了Dynamic方法,即Key-Value Coding方法实现的。
来源:http://blog.sina.com.cn/s/blog_6f92e3580100zx5s.html

转载于:https://www.cnblogs.com/pengyingh/articles/2356827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值