标签:
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用来创建对象,创建完成后,引用计数为1,只调用一次。
retain使引用计数+1,可以调用多次。
release使引用计数-1,可以调用多次。
当引用计数为0时,对象会被系统从内存中销毁,销毁之前,会自动调用此对象的dealloc方法。
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;
}
当对象的引用计数为0时,系统调用此对象dealloc。
我们应该在dealloc方法中,释放他持有的对象。
-(void)dealloc
{
[_dog release];
[_car release];
[super release];//为了释放父类持有的对象所有权。
}
1.完成Person和Dog的对象所有权的练习。
2.定义汽车Car,引擎(Engine),汽车持有引擎的所有权
有一个类有如下属性
@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;
标签:
原文地址:http://www.cnblogs.com/yanzifamily/p/4983044.html