黑马程序员——IOS基础——OC内存管理循环retain和autorelease

------- android培训java培训、期待与您交流!

循环retain:

涉及到循环引用:身份证Card和人Person就是相互包含的

这个时候需要使用@class

使用:@class Card;        它在person.h中代替#import "Card.h"

他的作用仅仅是告诉编译器,Card是一个类

我倒是觉得这和java中配置数据库关系中,一对一,一对多,多对多的时候,需要告诉双方。

如果在点m文件中需要使用类对象的时候,再导入进来---------比如在dealloc方法中release


一般头文件中不用#import Car.h ,因为import的意思就是拷贝,如果改变Car.h,那么有100个类引用了Car.h就要再次拷贝100次,所以最好用@class

但有个特例,那就是父类一定要引用#import

1.@class作用:仅仅是告诉编译器,某个名称是一个类

@class Person

2.开发中引用一个类的规范:

>在点h头文件中,用@class来声明类

>在点m文件中用#import来包含类的所有东西

3.两端循环引用解决方案:

>一端用retain

>一端用assign-----计数器不变


autorelease:

1.会将对象放到一个自动释放池中

2.当自动释放池被销毁时,会对池子中所有对象做一次release操作

3.会返回对象本身

4.调用完autorelease方法后,对象计数器 不变

好处:

1.妈妈以后再也不用担心我必须把release写在最后面了

2.也不再关心什么时候调用release

注意:
1.占用内存较大的对象不要随便使用autorelease
2.占用内存较小的对象使用时影响不大。


ios5.0后使用方式:

@autoreleasepool{
	//开始创建释放池1
	Person *p = [[[Person alloc] init] autorelease];
	p.age = 10;
	@autoreleasepool{
		//池子2
	}
	//开始销毁释放池
}	//到这之后Person销毁


可以创建无数个释放池,并且池子都是存放在中,先进后出

但这样不能准确控制时间,适合小对象

调用aurorelease只是将对象放到池子里面,对于对象计数器没有任何影响

使用错误注意:

1.要么使用autorelease 要么使用release,不能同时使用

2.不能多次调用:Person *p = [[[[Person alloc] init] autorelease] autorelease];

======================实际开发=========================

为了不用每一次都写很长的autorelease ,开发中常设计一个类方法(类名开头)返回autorelease对象

+ (id)person{
	return [[[self alloc] init] autorelease]; //尽量使用self,这样可以满足子类的需求
}
+ (id)personWithAge:(int)age{
	//Person *p = [Person person];/[self person];这一句代替下面一句
	Person *p =[[[self alloc] init] autorelease];//这里的self好处很大哦,以后任何子类调用这个方法创建person子类对象,都会返回子类对象,而不是Person父类对象
	p.age=age;
	return p;
}

调用时:

Person *p = [Person person];
Person *p1 = [Person personWithAge:100]; //返回带有参数的类方法

规律:

1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的

NSString *str = @"123123"; //由于不是通过alloc,不用release,因为默认是autorelease

NSString *str2 = [NSString stringWithFormat:@"age is %d",10];

2.开发中设计一个返回autorelease对象的类方法,方法名以类名开始+With+

NSNumber *num = [NSNumber numberWithInt:100];

3.在父类中创建对象时不要直接用类名,一般用self,可以,满足子类需求

------- android培训java培训、期待与您交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值