在iOS中,使用引用计数来管理OC对象的内存
一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间
调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1
- 内存管理的经验总结
当调用alloc、new、copy、mutableCopy方法返回了一个对象,
可以通过以下私有函数来查看自动释放池的情况
extern void _objc_autoreleasePoolPrint(void);
autorelease我们在创建完对象之后调用一次autorelease。这样就不用关心他什么时候会被销毁,他会自动根据情况销毁
02
在iOS中对象与对象之间都是有联系的
想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1
- (void)setDog:(Dog *)dog
{
[dog retain];
_dog = dog;
}
- (Dog *)dog
{
return _dog;
}
- (void)dealloc
{
[_dog release];
_dog = nil;
[super dealloc];
NSLog(@"%@dealloc",self );
}
Person *p = [[[Person alloc] init] autorelease];
NSLog(@"%ld", [p retainCount]);//p1
// NSLog(@"%ld", [p retainCount]);
Dog *dog = [Dog new];//dog1
[p setDog:dog];//dog2
[dog release]; //dog1
[[p dog] run];
[p release];//dog0,p0
03set方法的内存管理
要保持计数器的平衡,有+1就要有-1,
set方法的内存管理,在我们使用person的时候,有可能出现重新设置dog的情况,这时候可能会造成有一个dog对象无法被释放,先设置的那个,
当我们设置新的dog的时候,应该把上一个dog对象给release掉,
假如设置的新的dog还是原来的dog对象,可能会出现访问僵尸对象的错误,所以还要加一次判断是否为空
- (void)setDog:(Dog *)dog
{
if (_dog != nil)
{
[_dog release];
[dog retain];
_dog = dog;
}
}
04@property
@property就帮助我们生成set和get方法根据修饰词不同,生成不同的代码,对象类型就是用return,基本数据类型就是用assign
5
foundation框架中的很多的对象,使用类方法创建出来的对象,都在内部调用了autorelease方法了比如,array dictionary
+ (instancetype)person
{
return [[[Person alloc] init] autorelease];
}
网友评论