美文网首页
对"属性"的一些看法

对"属性"的一些看法

作者: 火之夜工作室 | 来源:发表于2017-03-22 10:34 被阅读7次

"属性"(property) 是OC 的一项特性,用于封装  对象  中的数据,这里把对象也单独列出来.会在下一篇文章谈一谈我自己的理解.

@interface ViewController :UIViewControlle{

        UILabel *_Label;

}

@property (nonatomic, strong) UILabel *Label

@end

成员变量 :在{ }中声明的变量都为成员变量 一般我们声明成员变量 以 _ 开头

实例变量: 本质上就是成员变量,只是实例的针对类而言,实例是指类的声明,

成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。

成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

区分好成员变量 实例变量 属性, 这可以帮助我们更好的使用, 下面我们进一步了解神秘的"属性"

要访问属性,我们可以通过"点语法","点语法"的效果与直接调用存取方法相同,因此,使用点语法和使用存取方法是一样的,然而属性还有更多的优势,如果使用属性的话,那么编译器就会自动编写访问这些属性的所需的方法,这个过程就叫做"自动合成".这个过程是由编译器在编译期执行,所以编译器里面是看不到这些"合成方法"的源码.除了生成源码,他还会自动向类中添加适当类型的实例变量,并且在属性名前自动添加下划线,以此作为实例变量的名字,同时我们也可以通过@synthesize 语法来指定实例变量的名字 ,

@interface ViewController :UIViewControlle

@property (nonatomic, strong) UILabel *Label

@end

如果我们在.m 中声明 @synthesize label = _Label  那么 Label 的名字 就改变了 ,改成 @synthesize 左边的名字了, 不过一般我们也不会用到 这个,来回改名字也不方便开发.

如果你不想让系统给你生成存取方法,那就可以使用@dynamic 关键字,他会告诉编译器不要给我创建实现属性所用到的实例变量,也不要为其创建存取方法,就算你不写存取方法,他还不会报错,厉害不.主要原因是他相信这个方法能在运行期找到.

属性的特质

atomic:

原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操作)在objective-c 属性设置里面 默认的就是atomic ,意思就是 setter /getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于 函数头尾加了锁 . 这样的话 并发访问性能会比较低 .

nonatomic:

非原子操作 一般不需要多线程支持的时候就用它,这样在 并发访问的时候效率会比较高 . 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作. 如果在程序中 我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步.

getter=getterName

指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数

setter=setterName

指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值)

当声明为 readonly 的时候,不能指定 set 方法

readwrite

如果没有声明成 readonly ,那就 默认是 readwrite 。可以用来赋值,也可以被赋值

readonly

不可以被赋值

assign

所有属性都 默认 assign ,通常用于标量(简单变量 int , float , CGRect 等)

一种典型情况是用在对对象没有所有权的时候,通常是 delegate ,避免造成死循环(如果用 retain 的话会死循环)

retain

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。

copy

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。且属性必须实现 NSCopying 协议

一般常用于 NSString 类型

相关文章

网友评论

      本文标题:对"属性"的一些看法

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