Autorelease
1.autorelease的基本用法
2.autorelease的好处
3.autorelease的使用注意
4.标准写法
@autoreleasepool
{
Person *p = [[[Person alloc] init] autorelease];
// 错误
[p release];
}
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
5.自动释放池
6.自动释放池的创建方式
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; // [pool drain];
@autoreleasepool
{
}
标准写法
void test()
{
@autoreleasepool
{ // { 开始代表创建了释放池
// autorelease方法会返回对象本身
// 调用完autorelease方法后,对象的计数器不变
// autorelease会将对象放到一个自动释放池中
// 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p = [[[Person alloc] init] autorelease];
p.age = 10;
@autoreleasepool
{
Person *p2 = [[[Person alloc] init] autorelease];
p2.age = 10;
}
Person *p3 = [[[Person alloc] init] autorelease];
} // } 结束代表销毁释放池
}
=============================================================
autorelease的应用
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
2.开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象
+ (id)person
{
return [[[self alloc] init] autorelease];
}
+ (id)person
{
return [[[self alloc] init] autorelease];
}
+ (id)personWithAge:(int)age
{
Person *p = [self person];
p.age = age;
return p;
}
@autoreleasepool
{
Person *p = [Person personWithAge:100];
p2.money = 100;
}
=============================================================
Arc的基本使用
1.ARC特点
在Arc中,定义弱指针是没有意义的写法
=============================================================
Arc中的循环引用
当两端循环引用的时候,解决方案:
1> ARC
2> 非ARC