iOS UI 基础iOS DeveloperiOS 开发

OC 属性的内存管理

2016-08-15  本文已影响165人  tanyufeng
来自星星的星球

属性的内存管理经常是让人很头疼的一件事,尤其是很多人在面试时经常会被问到,下面我们来讲讲属性的内存管理。

MRC:

在MRC下,属性的修饰词有三个,分别是assign,retaincopy三者对应不同的内存管理方式。

assign

assign:修饰基本数据类型,例如int,float等;他不会对基本数据类型进行内存管理;
参考setter和getter方法:

-(void)setAge:(NSInteger)age
{
    _age = age;
}

-(NSInteger)age
{
    return _age;
}

retain

retain:修饰对象类型,对属性进行内存管理; 该属性对象指向一个对象后,对应对象的引用计数+1。
参考setter和getter方法:


-(void)setSex:(NSString *)sex
{
    if (_sex != sex) {
        //释放旧对象
        [_sex release];
        
        //持有新对象
        _sex = [sex retain];
    }
}

-(NSString *)sex
{
    return [[_sex retain] autorelease]; //持有再自动释放
}


copy

copy:修饰对象类型, 对属性进行内存管理. 该属性对象指向一个对象后, 对应对象的引用计数不会改变。属性对象会复制对应对象的内容并生成一个新的对象,然后属性对象指向这个新的对象。
参考setter和getter方法

-(void)setHobby:(NSString *)hobby
{
    if (_hobby != hobby) {
        //释放原有对象
        [_hobby release];
        
        //复制新对象
        _hobby = [hobby copy];
    }
}

-(NSString *)hobby
{
    return [[_hobby retain] autorelease];
}

注意:利用copy修饰的属性被赋值后引用计数为1, 属性和对应对象指向的不是同一块内存空间;

ARC:

在ARC下,属性的修饰词有三个,分别是strong,weakcopy三者对应不同的内存管理方式。

*欢迎大家踊跃评论,让我们一起探讨技术!!
如果觉得文章不错,请帮忙点击文章下方的喜欢!!
你的支持将是对我最好的鼓励, 谢谢!!!

上一篇下一篇

猜你喜欢

热点阅读