1、OC属性的声明
关键字为@property
@property (nonatomic,copy)NSString *gender;
声明完属性后我们在.m文件中使用 @synthesize 关键字实现存取方法(这个会默认实现),通过@synthesize 我们可以把属性指向一个不同名称的实例变量
如下:name为属性名,possessionName为实例变量名
@synthesize name = possessionName;
总共有如下几条规则:
- 如果只声明一个属性a,不使用@synthesize实现:编译器会使用_a作为属性的成员变量(如果没有定义成员变量_a则会自动生成一个私有的成员变量_a;如果已经定义了成员变量_a则使用自定义的成员变量_a。注意:如果此时定义的成员变量不是_a而是a则此时会自动生成一个成员变量_a,它跟自定义成员变量a没有任何关系);
- 如果声明了一个属性a,使用@synthesize a进行实现,但是实现过程中没有指定使用的成员变量,则此时编译器会使用a作为属性的成员变量(如果定义了成员变量a,则使用自定义成员变量;如果此时没有定义则会自动生成一个私有的成员变量a,注意如果此时定义的是_a则它跟生成的a成员变量没有任何关系);
- 如果声明了一个属性a,使用@synthesize a=_a进行实现,这个过程已经指定了使用的成员变量_a:此时会使用指定的成员变量作为属性变量;
注意:如果我们自定义覆盖了所有的默认实现的存取方法,那么我们必须使用@synthesize关键字
2、OC属性特性关键字
OC属性都有一组特性,共有三类:
1.原子性,nonatomic为线程不安全的,atomic为线程安全,(默认是atomic)在iOS开发中为了性能都设为nonatomic,线程安全问题可以由其他方式解决
2.可写性,readwrite,可读可写;readonly,只读的(默认是readwrite)
3.内存管理有关的,assign--直接将传入的参数传给实例变量
![](https://img-blog.csdn.net/20151019234329863?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![]()
![]()
![](https://img-blog.csdn.net/20151019234351638?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
retain--存方法先保留传入的参数
copy--存方法先复制传入的参数
iOS5之后入了ARC特性,程序中不用自己retain、release、autorelease操作,编译器会自动为你管理内存,
编译时自动加上内存释放的代码,使用起来很方便。ARC是编译器特性,而不是iOS运行时特性,其实质还是
手动管理内存,只是相应内存管理的代码编译器会自动生成而已。由于ARC是编译器特性,因此它管理内存的
规则和之前ObjC内存管理是类似的,只要有一个对象引用(强引用)指向这个对象,那么这个对象就不会被释放。
在开启ARC之后我们可以使用四个关键字修饰我们的成员变量、局部变量和属性:
- strong(修饰变量用__strong):强引用,相当于原来的retain,每次赋值引用计数器加1,只要指针引用这个对象,这个对象就不会被销毁;
- weak(修饰变量用__weak):弱引用,相当于assign,和assign不同的是当对象释放后该变量会设置为nil防止野指针(虽然之前讲过的内容中assign都是应用于基本数据类型,其实它也完全可以修饰对象类型的属性);
- unsafe_unretained(修饰变量用__unsafe_unretained):和weak类似,区别就是如果对象释放后它不会像weak一样自动将指针设置为nil,有可能出现野指针;
- __autoreleasing(只能修饰变量不能修饰属性):修饰一个对象在使用完之后自动释放,通常用于延迟释放内存,同在MRC下调用对象的autorelease方法是等效的;
测试代码如下:
由于person1和person2都指向一个对象并且都是强引用,因此当person1设置为nil时对象仍然不会释放,所以此时person2还是指向这个对象,可以正常输出;
person3和它指向的对象是强引用,而person4是弱引用,因此当person3设置为nil后,对象没有了强引用就会释放,此时再打印person4自然就是null。
person5只有弱引用,赋值之后对象立即被销毁,这样写xcode会提示“Assigning retained object to weak variable; object will be released after assignment”。
但是如果使用storyboard或xib来设计界面的时候,我们会发现系统默认生成的属性就是weak,此时为什么不会销毁呢?那是因为它的顶层对象保持了一个强引用strong,因此这个对象不会被销毁。这样一来我们得出如下结论:
- 在iOS开发中使用strong、weak代替之前的retain、assign(基本类型使用assign);
- 如果一个属性使用IBOutlet修饰(也就是此属性时strongboard中组件),并且这个属性不是顶层的对象,那么使用weak;
- 如果一个属性不是storyboard组件(一般纯代码编写界面时),使用strong;