黑马程序员_内存管理

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
 
 
存管理:
 
我们都知道iPhone的RAM都是比较小的,但是它的1G可以秒杀很多安卓手机的2GRAM,完全不会顿卡的现象。为什么会这样呢?其实就是ios开发中,我们对内存管理得很严格,坚决不允许内存泄漏,用完就及时释放,这样使ios可以高效运行程序。
 
然而我们必须要谈一下怎么手动去管理内存,我们总不能永远依赖系统本身管理的。下面我们看一下怎么手动去管理内存:
 
对象是在堆里分配内存的,而其他整型枚举之类的是存放在栈,代码块结束释放
如果创建对象之后,在使用完不释放会造成内存泄漏
对象被回收之后,指针也要指向nil,此时是不能再对对象做任何操作
dealloc方法也是类似init一样,可以重写,让对象可以再调用方法前完成某些事,dealloc还是和init的使用很相像,同样要调用super当作对象调用方法,而且这个还需要写在最后面
另外野指针是指向不可用内存,是错误的;而空指针指向0,不会报错
 

如果组合或者继承需要指向子类,在都不使用对象的时候,可以在父类死亡之前的dealloc里面释放一个计数器,如果刚刚开始使用就在set方法来一个retain,这个是返回当前对象
重写dealloc返回类型是void,最后要调用父类的方法[super dealloc]
 
内存管理代码规范:
 
1 只要调用了alloc,必须有release
 

2 set方法额规范:

 

//基本类型:接赋值_age = age;

	//OC对象:先判断是不是新对象传进来

	if(car != _car)
	{
		对就对象做一次release
		[_car release];
		对新对象做一次retain
		_car = [car = retain];
	}
 
3 dealloc 的规范(重写)--->>>对象方法“-”
 一定要调用[super dealloc]而且放到最后面
 对当前对象所拥有的其他对象做一次release
 
4 对象不是通过alloc产生的就不需要release
 
5 @property:如果get和set都是自己写,不会自动生成成员变量,只有不写或者只写一个才会自动生成。
 
这里需要注意的是retain的重复使用问题:
 
@class仅仅告诉编译器,某个名称是一个类
使用场合 :两个类相互引用的时候,在声明文件的时候不能#import头文件,要用@class 类名
例如:

 

#import <Foundation/Foundation.h>
@class Card	// 声明用@class可以提高效率,因为不用复制,仅仅用在声明中

@interface Person : NSObject // 继承父类的声明必须是#import
@property (nonatomic, retain) Card *card;
@end

/*************************************************/

#import "Card.h"	// 实现是必须要用复制#import

@implementation Person	
- (void)dealloc		// 需要重写这个dealloc
{
	[_card release];
	[super dealloc];
}
@end

/**************************************************/

 

 
前面还有一个类Card的时候,两端引用如:
@property (nonatomic, assign) Person *name; // 一端用了retain,另一端不能用
 

然后我们看一下另外一种方法:@autoreleasepool
 
@autoreleasepool
{ // 这里的括号开始代表创建了释放池

	// autorelease方法会返回对象本身
	// 会将对象放到自动释放池中
	// 当自动释放池销毁时,会对释放池里面的所有对象release操作一遍
	
	Person *p = [[[Person alloc] init] autorelease]	;
	p.age = 10;
} 

使用注意:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
 
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
 
使用注意:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
 
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
 

遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
 
谁retain就谁release
 

可以写类方法快速返回一个对象
例如:
使用注意1:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
 
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
 
使用注意2:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
 
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
 

遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
 
谁retain就谁release
 

可以写类方法快速返回一个对象
例如:
使用注意:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
 
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
 
使用注意:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
 
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
 

遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
 
谁retain就谁release
 

可以写类方法快速返回一个对象
例如:
 
	Person *p = [Person person];

类中的方法是:

	+ (id)person
	{
		return [[[Person alloc] init] autorelease];
	}

或者:
	+ (id)personWithAge:(int)age
	{
		Person *p = [[[Person alloc] init] autorelease];
		p.age = age;
		return p;
	}

	主函数可以这么写:
		Person *p2 = [Person personWithAge:100]; //这样就可以创建一个初始化的对象
 
最后我们在说一下系统的ARC吧,这个就可以帮我们省很多事,可以不用手动管内存:
 

ARC 机制是编译器特性,只要没有强指针指向对象,就会释放
 特点:
1 不允许调用release,retain,retainCount
2 允许重写dealloc,但是不允许调用[super dealloc];
   @property的参数:
 
  strong:成员变量是强指针,相当于retain/适用于OC对象
  weak:成员变量是弱指针,相当于原来的assign/适用于OC对象/一般用于循环引用
  assign:使用于非OC对象
 
 指针分两种:1 强指针: __strong 默认的情况下 2 弱指针: __weak
 

项目里如果同时需要ARC和飞ARC的话,在不需要的的文件上面双击鼠标输入(-fno-objc-arc)
 
ARC的循环引用即你拥有我,我拥有你,就是组合里面都有对方,这时候以前不是ARC的时候,一个是retain,一个就是assign,现在用了ARC就是在@property里面的一个用strong,一个用weak。
 
---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值