属性和成员变量的区别

一、什么是成员变量?

1、定义

成员变量是定义在类的@interface和@implementation的{}中的变量,一般用@public,@private,@protected,@package来标明他的作用域

2、成员变量的作用域

-@public:在任何地方都能直接访问对象的成员变量
-@private:只能在当前类的对象中直接访问,如果子类中访问,需要调用父类的get/set方法
-@protected:可以在当前类及其子类对象中直接访问(系统默认修饰词)
-@package:在同一个包下就可以直接访问,比如说在同在一个框架

3、默认

-在.m文件中成员变量的修饰符为@private
-在.h文件中成员变量的修饰符为@protected

二、属性

通常通过一对访问器方法(getter/setter)来访问对象的属性

1、属性的声明

属性声明是以关键词@property开头,@property可以出现在类的@interface块中声明的任何地方。@property还可以出现在protocol或者category中。@synthesize的作用是实现属性的,如getter,setter方法

2、声明属性的关键字

a、atomic: 原子性

在OC属性设置里面,默认的就是atomic,意思就是setter/getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于函数头尾加了锁,这样的话,并发访问性能会比较低。

b、nonatomic:非原子性

非原子操作一般不需要多线程支持的时候就用它,这样在并发访问的时候效率会比较高。在OC里面通常对象类型都应该声明为非原子性的。iOS中程序启动的时候系统只会自动生成一个单一的主线程。程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作。

c、getter=getterName

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

d、setter=setterName

指定set方法,并需要实现这个方法。带一个与声明类型相同的参数,没有返回值(返回空值)
注:当声明为readonly的时候,不能指定set方法

e、readwrite

有set/get方法,默认是readwrite。

f、readonly

不可以被赋值,只有get方法

g、assign

通常用于标量(简单变量int,float,CGRect等)
一种典型情况是用在对对象没有所有权的时候,通常是delegate,避免造成死循环(如果用retain的话会死循环)

h、strong

释放旧对象,将旧对象的值赋予输入对象,在提高输入对象的索引计数为1,常使用在继承自NSObject的类。(MRC为retain)

i、weak

不增加对对象的引用计数,也不持有对象,因此不能决定对象的释放。他比assign多了一个功能,当对象消失后自动把指针变成nil

j、copy

建立一个索引计数为1的对象,然后释放旧对象,对NSString它指出,在赋值时使用传入值的一份拷贝,拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效

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