-
Notifications
You must be signed in to change notification settings - Fork 8
Description
property 等效于实例变量+getter/setter
@property = ivar(实例变量) + getter/setter(存取方法);
一旦定义一个属性编译器会自动编写访问这些属性所需的方法,这个过程由编译器在编译期执行,除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。
每次在增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在 method_list 中增加 setter 与 getter 方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出 setter 与 getter 方法对应的实现,在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.
@synthesize主要用来自定义Property所对应的ivar的名称。 下面的例子中本来属性所对应的ivar名称为_myDic,但是使用@synthesize myDic = myDicssss;声明之后,就使用myDicssss来替换_myDic了。
也就是说@synthesize用于给Property所对应的ivar实例变量指定名称,如果没有的话会使用下划线加属性名。注意这里仅仅是一个名称。
也有一种解读是:
#import <UIKit/UIKit.h>
@interface ZZYObject : UIView
@property(nonatomic,strong)NSMutableDictionary*myDic;
@end
-----------------------------
#import "ZZYObject.h"
@interface ZZYObject()
@end
@implementation ZZYObject
@synthesize myDic = myDicssss;
-(NSMutableDictionary *)myDic {
return myDicssss;
}
-(void)setMyDic:(NSMutableDictionary *)myDic {
myDicssss = myDic;
}
@end@dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。假如一个属性被声明为 @dynamic var,而且你没有提供 @Setter方法和 @Getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。