OC属性

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--直接将传入的参数传给实例变量
                                  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,因此这个对象不会被销毁。这样一来我们得出如下结论:
  1. 在iOS开发中使用strong、weak代替之前的retain、assign(基本类型使用assign); 
  2. 如果一个属性使用IBOutlet修饰(也就是此属性时strongboard中组件),并且这个属性不是顶层的对象,那么使用weak; 
  3. 如果一个属性不是storyboard组件(一般纯代码编写界面时),使用strong;

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值