黑马程序员 -- OC语言 Autorelease

来源:互联网 发布:时光八音盒 java版 编辑:程序博客网 时间:2024/05/04 01:43
------- android培训、.Net培训、IOS培训碧空海的技术博客,期待与您交流!----------

第五讲 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使用注意


 

 


0 0
原创粉丝点击