美文网首页
@Property & @synthesize & @dyna

@Property & @synthesize & @dyna

作者: 小李不木 | 来源:发表于2021-07-20 18:25 被阅读0次

    @Property 

    本质:@property = ivar(带下划线的实列变量) + getter/setter(存取方法);

    使用@property定义属性后,编译器会自动编写访问属性所需的方法,此过程叫做“自动合成”(autosynthesis)。

    这个过程由编译器在 编译期执行,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。

    系统做的事:

    1. 系统会在 ivar_list 中添加一个成员变量的描述

    2. 在 method_list 中增加 setter 与 getter 方法的描述

    3. 在属性列表中增加一个属性的描述

    4. 计算该属性在对象中的偏移量, 给出 setter 与 getter 方法对应的实现,在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.

    如果.m 文件中:@synthesize和@dynamic我们都没写,那么系统默认的就是@syntheszie var = _var,其实在.m文件中实际是存在@synthesize声明语句的,只是系统将其隐藏了。

    比如:

    使用@property声明一个属性name,系统默认的就是  @synthesize  name = _name; 

    有时候会看到 @synthesize  name这种写法 ,它等同于 @synthesize   name   =  name;

    如果在.h 文件中使用@property声明一个属性,在 .m 文件中同时又重写了setter和getter的话,就会报错,因为同时重写setter和getter方法,系统就不会自动帮我们生成成员变量。需要在.m 文件中给这个属性添加上@synthesize关键字:@synthesize  name = _name; 

    @synthesize

    @synthesize修饰一个属性表示:如果在.m 文件中,我们没有手动实现setter和getter方法,编译器会自动加上这两个方法。如果找不到实例变量则编译器主动创建一个。

    @synthesize obj=_obj 意义详解

            意思是:为成员变量_obj起个属性名称叫obj。 这样写是为了区分成员变量_obj和属性名称obj,在.m里面使用的时候见到_objh就知道是成员变量了,见到self.obj就知道是属性了。

            系统库中的所有类的声明部分都是这样写的。 为了区分成员变量名称和属性名称。

    例如:

    @implementation ViewController

    @synthesize publicName = ffff;

    如果类里没有ffff这个成员变量,它会自动帮你创建一个,并且帮你生成如下的setter和getter方法。

    - (void)setPublicName:(NSString *)publicName{

         ffff = publicName;

    }

    - (NSString *)publicName{

        return  ffff;

    }

    所以这个@synthesize,可以用来让属性和某个成员变量绑定。

    @dynamic

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

    编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

    注意:@dynamic  不能像  @synthesize   那样由系统在实现文件中(.m)自动生成实例变量,所以需要我们手动在.m类中 显式定义出实例变量  _var 。

    参考:

    iOS 关键字 @property,@synthesize,@dynamic

    iOS中@property、@synthesize和@dynamic的区别-搜云库

    iOS @property、@synthesize和@dynamic - 喵喵yy - 博客园

    相关文章

      网友评论

          本文标题:@Property & @synthesize & @dyna

          本文链接:https://www.haomeiwen.com/subject/bbjrmltx.html