Skip to content

介绍下@property、@synthesize和@dynamic的作用 #17

@tbfungeek

Description

@tbfungeek

@Property

property 等效于实例变量+getter/setter

@property = ivar(实例变量) + getter/setter(存取方法);

一旦定义一个属性编译器会自动编写访问这些属性所需的方法,这个过程由编译器在编译期执行,除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。

每次在增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在 method_list 中增加 setter 与 getter 方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出 setter 与 getter 方法对应的实现,在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.

@synthesize

@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

@dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。假如一个属性被声明为 @dynamic var,而且你没有提供 @Setter方法和 @Getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions