本帖最后由 Simpon 于 2016-10-27 10:32 编辑
开篇声明:本文是想各位同学们说明一下有关创建成员变量时,各个属性的意义以及一些偏底层的知识,大多数需要了解,因为面试官一般都会问到。首先说明一下定义一个成员变量时,@property是干什么的。
一、@property
@property 其实就是在编译阶段由编译器自动帮我们生成 ivar 成员变量,getter 方法,setter 方法。
使用“自动合成”( autosynthesis)这个过程由编译器在编译阶段执行自动合成,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成 getter、setter 方法之外,编译器还要自动向类中添加成员变量(在属性名前面加下划线,以此作为实例变量的名字)。为了搞清属性是怎么实现的,反编译相关的代码,他大致生成了五个东西:
- OBJC_IVAR_$类名$属性名称 // 该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表 示该变量距离存放对象的内存区域的起始地址有多远
复制代码 实际流程:
接下来说一道常见的笔试题。
二、readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用分别是什么。
三、什么情况使用 weak 关键字,相比 assign 有什么不同?
首先明白什么情况使用 weak 关键字?
在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如:weak 和 assign 的不同点
四、使用 atomic 一定是线程安全的吗?
答案很明显。不是,atomic 的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。
举例:
当然,关于属性关键字所引出的技术点及问题不只如此.如需了解更多,请点击【iOS技术分享】关于属性关键字,你又知道多少?(下)
精华推荐: |
|