黑马程序员-ARC中-@property的strong,weak以及 assign的使用

一.明确

只是在ARC打开的情况下,强指针和弱指针的概念,以及Strong和Weak的特性。
在ARC关闭的情况下,在@property下敲’weak’都不能写。报如下错误:

而 assign,是直接赋值,适用于非 OC 对象类型,我们经常在定义基本数据类型的时候用它.在手动管理内存的在OC中,我们经常用到 assign,在 ARC中,我们用 weak 来代替.

二.ARC 简介

ARC 判断的准则:只要没有强指针指向对象,就会释放对象.

ARC特点,如下:
    (1)不允许调用release、retain、retainCount、autorelease。

  (2) 允许重写dealloc,但是不允许调用[super dealloc]。

    (3) @property参数
       strong : 成员变量是强指针,相当于 MRC 时候的 retain(适用于OC对象类型)
      weak   : 成员变量是弱指针,相当于原来的assign(适用于OC对象类型)
      assign:适用于非OC对象类型
    (4) 以前的retain改为现在(ARC)用strong.

三.实例代码

创建一个 Person类,然后在 Person 中创建不同的属性,在应用中,用图示配合代码的形式,来看看用 strong,weak.assign 的区别.

(1) 我们首先看strong 的属性:

接着,加上p =nil这句代码后:

分析:p为空,Pserson对象先为空,然后_dog不在了。没有强指针指向dog这时候,dog对象释放

(1) 我们首先看 weak 的属性:

       当弱指针指向的变量被释放,那么弱指针就会变成空指针。

分析:这时候,p指向的Dog对象不在了,_dog指向的Dog对象不在了,那么_dog就变成了空指针,_dog为空。

小结:

(1)如果要保证人(Peson)在的时候,狗(Dog)也要在,那么用strong。
(2)如果要保证人(Peson)在的时候,狗(Dog)不一定要在,那么用week。
(3)类似于retain和assign。

 

四.总结 copy,assign,retain,strong,week的使用情况

         这些关键字针对属性的set方法
         (1)copy:当你想要对象产生一个新的对象副本,改变对象副本的时候,不改变原对象!就可以使用,主要针对的NSString,而且这个属性只对那些实行了NSCopying协议的对象类型有效。
             还针对含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet。
         (2)assign:简单赋值,不更改索引计数。主要针对基础数据类型 (例如NSUInteger,CGFloat)和C数据基本类型(int, float, double, char等。
         (3)retain:针对NSObject及其子类。一般情况下,有新的object对象产生时,需要retain一下保留对它的使用权。或者在Object类创建创建多个子类对象时,你也要retain。比如:@property (nonatomic,retain) People *people;
            注意:,alloc,new,copy的时候,对应的Object对象都会retain一次。
         (4)strong:简单赋值,和assign的使用场景相同,没有太大的区别。
         (5)week:简单赋值,和assign的使用基本相同。但是区别是assign在地址指向的内存内容销毁后,指向内存的地址依然存在,下次如果还继续执行原调用语句的,会出现比如野指针这样的错误。 week在对象销毁后,给被销毁的对象赋nil值,让其的地址指向空,即变成了空指针,避免了出现野指针的错误。

 

posted @ 2015-12-04 22:30  coderQin  阅读(280)  评论(0)    收藏  举报