第五讲 Autorelease
A.autorelease基本使用
在声明中写;
@interface Person :NSObject
@property (nonatomic, assign) int age;//nonatomic让代码处于高性能。Assign仅仅用于成员变量。setAge:(int)age。
@property (nonatomic, retain) NSString *name;
@end
在实现中写;
@implemention Person
@end
在主函数中写;
Int main()
{
Person *p = [ [ [Person alloc] init] autorelease];
P.age = 10;
Return 0
}
代码放在这里会有很好的效果,自动释放内存池。
B.autorelease使用注意
在主函数中写;
Int main()
{
@autoreleasepool
{
Person *p = [ [ [Person alloc] init] autorelease];
P.age = 10;
@autoreleasepool
{
Person *p1 = [ [ [Person alloc] init] autorelease];
P1.age = 10;
}
//在程序运行过程中可以创建无限个自动释放池,他们都是放在栈中的,栈有先进后出的特点。
//autorelease不能实现类对象的精确释放,精确释放仅仅用类对象的[p release];
}
}
C.常见使用错误
1、多次释放内存,导致野指针。不能同时用autoreleasepool和[类对象 release];
池子已销毁,多次释放内存,形成野指针。
D.自动释放池
1、运用@autoreleasepool {程序放在这里就是}
E.autorelease的应用
1、在声明中
@property (nonatomic, assgin) int age;
+(id)person
{
Return [[[person alloc ] init] autorelease];
}
+(id)
-(void)dealloc
{
NSLog(@”hhhhhhhhhhhh’);
[super dealloc];
}
2、在主函数中
Person *p =[[[Person alloc] init]autorelease];
p.age = 20;
[p release];
@autoreleasepool
{
Person *p2 = [[Person person]];
P2.age = 100;
}
注解:[Person person]等价于[self person]; 去当前类中寻找person的类方法。就是去寻找如下如所示;
在创建另外一个类。好人(GoodPerson)类继承于Person类;继承了父类Person 就拥有了父类中的所有可用方法。
@interface GoodPerson :Person
@property (nonatomic, assign) int money; //有一个金钱的属性
@end
在主函数中可以这样操作了
@autorelease pool
{
GoodPerson *p= [GoodPerson personWithAge:10];// personWithAge这个方法属于父类的
// [GoodPerson personWithAge:10]这个方法返回的事Person的对象。
p.money = 100;
}
F.用法总结
一、计数器的基本操作
1>retain;:+1
2>release:-1
3>retainCount:获得计数器值
二、set方法的内存管理
1>set方法的实现
-(void)setCar:(Car *)car
{
If (car != -car)
{
[-car release];
-car = [car retain];
}
}
2>dealloc方法的实现(不直接调用dealloc)
-(void)dealloc
{
[-car release];
[super dealloc];
}
三、@property参数使用
1>OC对象类型
@property (nonatomic, retain) 类名 *属性名
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id car
//被retain过的对象,必须在dealloc方法中release属性
1>非OC对象类型
@property (nonatomic, assgin) 类名名称 属性名
@property (nonatomic, assgin) int age;
四、autorelease
1>系统自带的方法中,如果不包含有alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
2>开发中经常写一些类方法快速创建一个autorelease的对象
*创建对象的时候不要直接使用类名,应该用self.
G.ARC基本原理
1、实例举例,创建项目的时候要勾选下面的框框
在主函数中。
Person *P = [[Person alloc] init];
P.age = 10;
[p release];//在使用ARC的时候,这个调用是错误的。只要是关于内存有关的这些功能,均不能调用了
如何验证,接下来在类的实现中重写dealloc方法(在编译器中有默认的这个函数)
-(void)dealloc
{
NSLog(@”现在调用了”);
[super dealloc];//ARC已经开启,在调用和内错有关的将会出错。
}
2、ARC原理
1>判断准则;只要没有强指针指向对象,就会释放对象。
指针分两种;弱指针和强指针(默认情况下,所有指针是强指针)
Person *p2 = p;//就是把P指向的地址给P2,继而P2也指向Person对象。所以p和p2指向同一个对象(地址块)
__weak Person *p2 = p;//这个情况下指针p2为弱指针。关键字为__weak
弱指针不能决定是否被释放。
P = nil;//此处p被清空。
注意:一旦发现弱指针指向的对象没有了,编译器会自动清空指针。
__weak Person *p = [[Person alloc]init];
这一行代码过后,指针指向的地址被清空。所以打印出来的为NULL。
3>ARC中的@property和strong
@property (nonatomic, strong) Dog *dog;//指明dog为强指针。
@property (nonatomic, weak) Dog *dog;//指明dog为弱指针。
p.dog;作用就是调用set方法(setDog:10)。
4>ARC特点
5>ARC使用注意