码迷,mamicode.com
首页 > 其他好文 > 详细

Object-c 内存管理

时间:2015-11-21 11:44:40      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

                              内存管理

主要内容

1.内存管理的概念

2.引用计数

3.如何持有对象所有权

4.自动释放池

5.@property的使用

 

什么是内存管理

内存管理是关于如何管理对象生命周期的编程原则。

int main(int argc, char *argv[])

{

       int value = 100;

       Dog *mydog = [[Dog alloc]init];

       [dog setNum:@"蓝眼儿"];

       return 0

}

栈区

value 100

person 0x12345

 

 

堆区

 

Dog对象

_name

 

 

 

 

 

oc中的内存管理只针对oc中的对象,所有对象都继承NSObject

基本数据类型不需要管理内存。

当一个对象没有人再使用,该对象应该从内存中销毁掉。

引用计数

所有oc对象都有一个计数器,这个计数器我们称为引用计数。

引用计数表示有几个人在使用当前对象。

NSObject对象

 

 

retainCount

引用计数

每个对象都有一个retainCount引用计数器,表示当前对象被引用的数量。

怎么是引用计数器加减呢?

 

1.调用retain方法, 计数+1,调用release方法,计数-1

2.当引用计数为0时,说明没有人使用此对象,此对象会被系统销毁。

alloc   retain       release

alloc用来创建对象,创建完成后,引用计数为1,只调用一次。

retain使引用计数+1,可以调用多次。

release使引用计数-1,可以调用多次。

当引用计数为0时,对象会被系统从内存中销毁,销毁之前,会自动调用此对象的dealloc方法。

retain, release示例

Person *person = [[Person alloc]init];//计数器为1

[person retain];//计数器为2

[person retain];//计数器为3

[person release];//计数器为2

[person release];//计数器为1

[person release];//计数器为0,对象从内存中销毁,调用dealloc方法。

为什么使用引用计数

                                                        遛狗的例子

 

对象所有权

当一个所有者(owner,本身是一个oc对象)做了如下动作,它就拥有了一个对象的所有权(ownership)

alloc                          retain                [mutable]copy

使用如下方法

release             autorelease

黄金法则

如果对一个对象使用了alloc,[mutable]copy, retain, 那么你必须使用相应的release或者autorelease释放。

如何持有对象

实例分析:如何让人持有狗的对象所有权

 

1.set方法持有对象的所有权

-(void)setDog: (Dog *)dog

{

       if (_dog!=dog) {

              [_dog release];

              _dog = [dog retain];

       }

}

2.自定义初始化方法,持有对象的所有权

-(id) initWithDog: (Dog *)dog

{

       self = [super init];

       if (self != nil) {

              _dog = [dog retain];

       }

       return self;

}

dealloc方法

当对象的引用计数为0时,系统调用此对象dealloc。

我们应该在dealloc方法中,释放他持有的对象。

-(void)dealloc

{

       [_dog release];

       [_car release];

       [super release];//为了释放父类持有的对象所有权。

 

课堂练习

1.完成Person和Dog的对象所有权的练习。

2.定义汽车Car,引擎(Engine),汽车持有引擎的所有权

property的使用

有一个类有如下属性

@interface User:NSObject

{

       int userId;

       NSString *_userName;

       NSString *_passwd;

       NSString *_email;

       NSString *_birthday;

}

设置器

-(void) setUserName: (NSString *)name

{

       _name = name;

}

-(NSString *)userName{

       return _name;

}

每个属性都这样写set和get方法是很麻烦的。

property可以自动生成一个get和set方法,不需要我们手动编写

@interface User : NSObject

{

       //不必在定义,@property自动生成

}

@property(nonatomic, retain) NSString *userName;

使用方法

 

Object-c 内存管理

标签:

原文地址:http://www.cnblogs.com/yanzifamily/p/4983044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!