retain assign copy在@propeerty中的使用实际上是通过控制set方法进行内存管理

转载 2016年06月02日 01:12:43
retain assign copy在@propeerty中的使用实际上是通过控制set方法进行内存管理。下面详细介绍:


1.retain:


    例如:


        @class Dog


        @property(nonatomic,retain) Dog *dog;


    注:nonatomic与atomic相对应,涉及线程,比较麻烦,这里不做赘述,读者仅需记住,nonatomic相对于atomic来说性能高,而声明属性时一般默认为atomic,故需在此申明nonatomic


这里使用了retain,那么在set方法中,究竟如何体现的呢?


- (void)setDog:(Dog *)dog


{


   if(_dog != dog){          //判断是否需要重新赋值


      [_dog release];        //释放旧引用,计数器-1


      _dog = [dog retain];   //重新赋值,计数器+1


   }


}


2.assign:


   例如:


        @property(nonatomic,assign)int count;


这里使用了assign,那么在set方法中,究竟如何体现的呢?


- (void)setCount:(int)count


{


   _count = count;


}


2.assign:


   例如:


 


        @property(nonatomic,copy)NSString * str;


这里使用了copy,那么在set方法中,究竟如何体现的呢?


- (void)setStr:(NSString *)str


{


 if(_str != str){          //判断是否需要重新赋值


      [_str release];        //释放旧引用,计数器-1


      _str = [str copy];   //重新赋值,使用copy


   }


}


总结:


     1.retain:先release旧值,再retain新值,在上例中_dog与dog最终指向同一快内存区域。


     2.assign:直接赋值,不考虑内存管理。


     3.copy:先release旧值,再copy新值,copy的本质为复制该内存所存储的内容,重新创建一个对象赋给其相同的内容,很明显,在copy这个过程中也发生了一次retain,不过这是个全新的对象。在上例中,_str与str最终指向了不同的内存区域,但其内容一样。


     4.从retain assign copy的特点中我们可以看出:


            retain一般适用于OC中的对象


            assign一般适用于非OC对象,如int等普通类型


            copy一般适用于NSString等不可变的对象,因为是重新创建了对象,并且内容不变,因此不用担心后面的操作会对该属性的值产生影响。


 


copy与retain实例分析:


      假设str为对象p的属性


      @property(nonatomic,copy)NSString *str;


      NSMutableSting *s = [[NSMutableSting alloc] setString:@"hello"];


      p.str = s;   //此时,str的值为@"hello"


      [s appendString:@"world"];   //此时,s的值为"hello world",但是str的值依然为"hello".


     但是如果开始时str的申明为:


    @property(nonatomic,retain)NSString *str;


    那么,在进行完 [s appendString:@"world"]之后,str的值将变为"hello world".因为str与s共用一块内存,内容完全相同,而s是可以改变的,所以s改变后,str也将改变。


 


注:以上皆为个人理解,如有错误,请留言指正,万分感谢。

OC中内存管理 assign, retain, copy 的 setter 和 getter 方法

最近关于 setter 和 getter 方法突然有些晕, 所以重新做了整理 内存管理 assign, retain, copy 的 setter 和 getter 方法assign的 setter ...

IOS retain copy assign alloc atomic nonatomic 内存管理和getter setter方法!

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样。 ...

iOS内存管理(1)-- iOS中strong,copy,retain,weak,assign的用法

一、nonatomic关键字: 首先修饰属性会要用到nonatomic(非原子的),相反的atomic(原子的),atomic是Objc使用的一种线程保护技术顾名思义就是在对该属性进行修改的时候保护起...
  • Winzlee
  • Winzlee
  • 2016年06月21日 16:33
  • 494

内存管理(retain,assign,copy,strong,weak)

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样。 ...

IOS内存管理retain,assign,copy,strong,weak

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样。(一般情...
  • phxiang
  • phxiang
  • 2017年03月02日 10:37
  • 187

Objective-c 的 内存管理和@property strong,weak,assign,copy,retain等关键字介绍

@property strong,weak,assign,copy,retain等关键字@property介绍 OC意识到当getter方法和setter方法遇到一个类有大量的实例变量时,ge...

OC-内存管理:retain/copy(深、浅拷贝)的使用和区别详解

通过程序来说明OC中的:深拷贝(deep copy)、浅拷贝、retain的使用及它们之间的区别。...

IOS属性(@property)的修饰词assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite解释、以及一部分内存优化方法

修饰词:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite 其中 ARC:assign、weak、strong...

iOS内存管理:strong,weak,retain,assign

strong与weak是由ARC新引入的对象变量属性 xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5...

iOS开发学习手动内存管理暂时抛弃ARC以及retain/assign知识——iOS工程师面试必考内容

转载自:http://blog.csdn.net/weisubao/article/details/39956563 我们为什么需要内存管理?当使用内存达到40M和45M时候会发出警告,如果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:retain assign copy在@propeerty中的使用实际上是通过控制set方法进行内存管理
举报原因:
原因补充:

(最多只允许输入30个字)