内存管理的原则 :
1:如果对象有人在使用,那么就不应该回收。如果你想使用这个对象,就应该让这个对象retain一次。如果你不想用这个对象了,就应该让这个对象release一次。
2:谁创建 谁release (哪个对象创建了空间,那个对象就release)
3:谁retain 谁release (哪个对象的空间引用计数器retain了,哪个对象就release)
引用计数器
用来保存当前对象有几个东西在使用它(数字)
用来判断对象是否应该回收内存空间(如果对象不等于nil,当引用计数器为0,此时要回收对象的内存空间)
操作
retain 使得引用计数器+1
release 使得引用计数器-1
retainCount 得到引用计数器的值
如果一个对象被释放的时候,会有“临终遗言”(会调用该对象的dealloc方法)
dealloc方法是NSObject的,一般我们要重写dealloc方法
在dealloc方法内部,要调用[super dealloc];
@implementation Person
-(void)dealloc{
NSLog(@"dealloc");
[super dealloc];
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//相当于retain一次
Person *p = [Person new];
//获得对象的引用计数
NSUInteger count = [p retainCount]; //count =1
NSLog(@"count=%lu",count);
[p retain];
NSLog(@"count = %lu",[p retainCount]);//count = 2
//retain一次,就要release一次
[p release];
[p release];
}
return 0;
}
内存管理研究的内容:
1:野指针:定义的指针变量没有初始化或者是指向的空间已经被释放。
2:内存泄露:如果栈区的指针变量已经被释放了,而堆区的空间还没有释放,堆区的空间就被泄露。
单个对象的内存管理(野指针):
1:野指针错误:访问了一块坏的内存(已经被回收的不可用的内存)。
2:僵尸对象:所占内存已经被回收的对象, 僵尸对象不能再被使用。
3:空指针:对象值为空,没有指向任何东西的指针,给空指针发送消息不会报错。
nil: 表示对象的值
NIL:表示类的值
NULL:通用指针(泛型指针)
[NSNull null]: 是一个对象,他用在不能使用nil的场合
4: 当一个对象的空间被释放了,引用计数器为0,这个对象是僵尸对象,如果再用[对象名 retain]方法是不行的
set方法内存管理标准写法
-(void)setCar:(Car *)car{
if (_car != car) {
[_car release];
_car = [car retain];
}
}
@property参数的使用
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (nonatomic,assign)int tuiNum;
@end
ARC的概念
强指针:默认的情况下,所有的指针都是强指针,关机子strong
弱指针:__weak关键字修饰的指针
在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease
三个关键字就好~这是ARC的基本原则。
ARC的工作原理
在代码编译时为你自动在合适的位置插入release或autorelease。
ARC的判断准则
只要没有强指针指向对象,对象就会被释放
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。
ARC特点总结
1、不允许调用release,retain,retainCount
2、允许重写dealloc,但是不允许调用[super dealloc]
3、@property
strong :相当于原来的retain(适用于oc对象),成员变量是强指针
weak :相当于原来的assign(适用于oc对象),成员变量是弱指针
assign :适用于非oc对象类型(基础类型)
ARC使用注意事项
1、ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2、 __weak Person *p =[[Person alloc] init] 不合理,对象一创建处理啊就被释放掉,对象释放掉后,ARC把指针设置为nil
3、