属性和成员变量

属性和成员变量

成员变量

在接口interface里面的统称为成员变量成员变量必须包含在大括号中
注意在ObjC中不管是自定义的类还是系统类对象都必须是一个指针

属性

  • 编译器自动将变量set和get方法的合成,可用点语法读取,可作为变量使用
  • 可以使用关键字 @synthesize 来对属性进行绑定。@synthesize 关键字后面紧跟着的是属性名字,等号后面即为该属性所绑定的成员变量。
  • 关键字 @synthesize 可以省略,仅使用 @property 关键字就可以完成成员变量和 set get 方法对创建。在调用方面,使用属性定义的成员变量,可以使用 set get 方法调用,也可以使用点语法调用。
  • 属性(描述类的特征)
  • 为实例变量提供了setter和getter方法的默认实现,能在一定程度上简化代码,增强实例变量的访问安全性.
  • 属性的定义
    1.属性的声明: 使用@property声明属性,相当在@interface中声明了两个方法(setter和getter),如:@property (NSString *)name;
    2.属性的实现: 使用@synthesize实现属性,相当于在@implementation中实现了setter和getter这两种方法,如:@synthesize name = _name;

属性关键字

属性关键字
@property后面的()内可以配置一些参数,配置了参数后,编译器会为我们生成不同的getter和setter方法
读写属性
读写属性即控制了属性是否存在设置器方法,这些参数之间是互斥的。

readwrite(默认): 表名了属性是可读可写的,即属性具有setter方法和getter方法,若该属性由@synthesize实现,则编译器会自动生成这两个方法;

readonly:表明属性是只读的,即属性只有获取器方法,将生成getter方法而不生成setter方法。如果视图对该属性使用点语法赋值,将引起编译器错误,只有当该属性由@synthesize实现时,编译器才会为其合成获取方法;

原子性

automic(默认):这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题;

nonatomic:该属性不提供多线程保护,如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率;

内存管理语义

属性用于封装数据,而数据则要有“具体的所有权语义”。下面这一组特质仅会影响“设置方法”。例如,用“设置方法”设定一个新值时,它应该是“保留(retain)”此值呢,还是只将其赋给底层实例变量就好?编译器在合成存取方法时,要根据此特质来决定所生成的代码。如果自己编写存取方法,那么久必须同有相关属性所具备的特质相符。

retain:对象使用,持有对象,retainCount + 1;

assion:这个属性一般用来处理基础类型,比如int、float等待,如果你声明的属性是基础类型的话,assign是默认的,你可以不加这个属性;

strong:此特质表明该属性定义了一种“拥有关系”。为这种属性设置新值时,设置方法会先保留新值,释放旧值,然后再将新值设置上去。主要用于修饰强引用的属性;

weak:此特质表明该属性定义了一种“非拥有关系”。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assin类似,然而在属性所指的对象遭到摧毁时,属性值也会清空。主要用于修饰弱引用的属性,当弱引用的对象被释放后,该对象将被自动赋予nil值;

copy:此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝”。当属性类型为NSString*时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可以修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”的字符串,确保对象中的字符串值不会无意间变动,只要实现属性所用的对象是“可变的”,就应该在设置新属性时拷贝一份。我们可以暂时这样理解,当它使用在不可变类型的属性时,等于strong;当它使用在可变类型时,每次赋值都会拷贝一个新的对象。

使用成员变量和属性的区别

  • 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。
  • 用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。

你可能感兴趣的:(属性和成员变量)