美文网首页
ios关键字总结

ios关键字总结

作者: 二维码码 | 来源:发表于2018-04-10 17:39 被阅读0次

    1.@property 

    在预编译阶段由编译器自动帮我们生成IVar成员变量,setter,getter方法。

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

    每次增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在method_list 中增加 setter 与 getter 方法的描述,在 prop_list 中增加一个属性的描述,计算该属性在对象中的偏移量,(该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表 示该变量距离存放对象的内存区域的起始地址有多远)然后给出 setter 与 getter 方法对应的实现。

    在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转。


    2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak作用

    readwrite:默认属性,可读可写。

    readonly:只读不能赋值设置。

    assign:不会使引用计数加1,一般用于基础数据类型。

    retain:会是引用计数加1.

    copy:建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。

    nonatomic:非原子性访问,多线程并发访问会提高性能。

    atomic:原子性访问。消耗性能。

    strong:打开ARC时才会使用,相当于retain。

    weak:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil。



    3.weak与assign

    在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决。

    weak 策略在属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针指向 nil,在 OC 给 nil 发消息是不会有什么问题的;如果使用 assign 策略在属性所指的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃assigin 可以用于修饰非 OC 对象,而 weak 必须用于 OC 对象。


    4.@synthesize 和 @dynamic 分别有什么作用

    @property 有两个对应的词,一个是@synthesize,一个是@dynamic。

    如果@synthesize 和@dynamic 都没写,那么默认的就是:

    @syntheszie var = _var;

    @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。

    @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)

    假如一个属性被声明为

    @dynamic var;

    然后你没有提供@setter 方法和@getter 方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺 setter方法会导致程序崩溃;

    或者当运行到 someVar = instance.var 时,由于缺 getter 方法同样会导致崩溃

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



    5.在有了自动合成属性实例变量之后,@synthesize 还有哪些使用场景?

    首先的搞清楚什么情况下不会 autosynthesis(自动合成):

    1,同时重写了 setter 和 getter 时

    2,重写了只读属性的 getter 时

    3,使用了@dynamic 时。

    在 @protocol 中定义的所有属性在 category 中定义的所有属性重载的属性,当你在子类中重载了父类中的属性,必须使用@synthesize 来手动合成ivar。

    应用场景:

    1,当你同时重写了 setter 和 getter 时,系统就不会生成 ivar。这时候有两种选择手动创建ivar

    使用@synthesize foo = _foo

    2,关联@property 与 ivar可以用来修改成员变量名,一般不建议这么做,建议使用系统自动生成的成员变量

    相关文章

      网友评论

          本文标题:ios关键字总结

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