黑马程序员技术交流社区
标题:
内存管理之autorelease方法
[打印本页]
作者:
卫博生
时间:
2015-10-11 22:29
标题:
内存管理之autorelease方法
autorelease方法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池内所有对象做一次release操作
3> autorelease方法会返回对象本身
4> 调用autorelease方法之后,对象的计数器不变
自动释放池
在程序运行过程中,可以创建多个自动释放池。自动释放池以栈的形式存在内存中(先进后出)
当对象调用autorelease方法时,会将该对象放到栈顶的释放池
创建自动释放池
int main()
{
// 创建自动释放池
@autoreleasepool{
// 创建对象,并调用autorelease方法
Person *p = [[[Person alloc] init] autorelease];
} // 自动释放池销毁,对象销毁
return 0;
}
当对象占用内存较大时,不要使用autorelease。调用autorelease之后,不用再使用release。
一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
开发中可以提供一些类方法来快速创建已经autorelease的对象
+ (id)person
{
// 创建对象时,不直接使用类名,使用self
return [[[self alloc] init] autorelease]
}
ARC(Automatic Reference Counting)
在ARC模式下把指针分为两种
强指针:默认情况下,所有指针都是强指针__strong
弱指针:__weak
ARC的判断准则:只要没有强指针指向对象,就会释放对象
@interface Person : NSObject
@property(strong,nonatomic) Dog *dog;
@end
@implementation Person
// 重写dealloc
-(void)dealloc
{
NSLog(@"Person被杀死了");
// [super dealloc];不允许调用
}
@end
@interface Dog : NSObject
@property(weak,nonatomic) Person *person;
@end
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog被杀死了");
}
@end
int main()
{
// ARC模式下的循环调用
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}// 程序结束,所有对象被销毁
作者:
卫博生
时间:
2015-10-11 22:35
ARC特点 1> 不允许调用release、retain、retainCount 2> 允许重写dealloc,但是不允许调用[super dealloc] 3> @property参数 strong:成员变量是强指针(适用于OC对象类型) weak:成员变量是弱指针(适用于OC对象类型) assign:适用于非OC对象类型 4> 用strong替代retain ARC中的循环引用:strong替代retain,weak替代assign
作者:
木亙。
时间:
2015-10-11 22:39
涨知识了~~
作者:
卫博生
时间:
2015-10-11 22:58
木亙。 发表于 2015-10-11 22:39
涨知识了~~
其实有些也不懂,不过先记下来的啦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2