首页 > 代码库 > OC内存管理
OC内存管理
定义的属性,在赋值的时候最好使用setter方法,在取值的时候都可以,差别不大
便利构造器的内存释放(便利构造器创建的对象不用释放内存,里面自带内存释放)
第一种:
第二种
第三种:也是最常用最好的一种
第四种:
// 内存管理原则四
//谁污染谁治理,凡是你自己alloc,copy,retain的,需要你自己来处理,不是你干的,不需要你管
// 集合对象(数组,字典,set(集合))会对他们管理的对象引用计数加一,当他们销毁时,会对他们管理的这些对象引用计数减一
//谁污染谁治理,凡是你自己alloc,copy,retain的,需要你自己来处理,不是你干的,不需要你管
// 集合对象(数组,字典,set(集合))会对他们管理的对象引用计数加一,当他们销毁时,会对他们管理的这些对象引用计数减一
// 使用便利构造器创建对象时,不需要对对象进行释放,便利构造器里面有autorelease
Person * person = [[Person alloc] initWithName:@"张三" sex:@"男" age:20];
NSLog(@"%lu", [person retainCount]);
NSArray * array = [[NSArray alloc] initWithObjects:person, nil];
[person release];
[array release];
NSLog(@"%lu", [array retainCount]);
NSLog(@"%lu", [person retainCount]);
方法内部创建的对象:
//在方法里面创建的对象,首地址如果保存在局部变量中,那么在出方法之前一定要release或者autorelease掉
如果下面要使用方法里面创建的对象,可以对这个对象定义成一个属性
- (void)loadData
{
//下面两种方法都可以使用,如果直接使用_array进行赋值,可能会有内存泄露
self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
// self.array = [NSArray arrayWithObjects:@"aa", @"vv", nil];
// [_array release];
NSLog(@"%@", _array);
// [array autorelease ];
}
- (void)loadData
{
//下面两种方法都可以使用,如果直接使用_array进行赋值,可能会有内存泄露
self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
// self.array = [NSArray arrayWithObjects:@"aa", @"vv", nil];
// [_array release];
NSLog(@"%@", _array);
// [array autorelease ];
}
// 内存管理的第一个原则,只要出现alloc,retain, copy地方都要有release或者atuorelease与之对应
//建类必备dealloc,只要声明retain或copy的属性,都要到dealloc release一次
//先release 自己类属性生成的实例变量
// 再调用父类的dealloc
- (void)dealloc
{
NSLog(@"被销毁了”);//非必要
[super dealloc];
}
// 再调用父类的dealloc
- (void)dealloc
{
NSLog(@"被销毁了”);//非必要
[super dealloc];
}
//建类必写
- (void)dealloc
{
self.name = nil;
- (void)dealloc
{
self.name = nil;
/* //安全释放 等价于: [_name release]; _name = nil;*/
self.sex = nil;
self.array = nil;
[super dealloc];
}
self.sex = nil;
self.array = nil;
[super dealloc];
}
自动释放池
/*自动释放池的新写法*/
@autoreleasepool {//自动释放池的工作原理
//当对一个对象发送autorelease消息时,会把对象扔到离他最近的自动释放池中,当这个自动释放池销毁时,会对池中管理的autorelease对象逐一发送release消息
/*自动释放池老的写法NSAutoreleasePool*/
[stu1 retain];
[stu2 retain];
NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
[stu1 autorelease];
[stu2 autorelease];
[stu1 autorelease];
NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
}
@autoreleasepool {//自动释放池的工作原理
//当对一个对象发送autorelease消息时,会把对象扔到离他最近的自动释放池中,当这个自动释放池销毁时,会对池中管理的autorelease对象逐一发送release消息
/*自动释放池老的写法NSAutoreleasePool*/
[stu1 retain];
[stu2 retain];
NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
[stu1 autorelease];
[stu2 autorelease];
[stu1 autorelease];
NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
}
NSCopying协议必须实现
//NSZone用来记录源对象的内存存储信息
//当你对一个对象调用copy方法,那么会自动调用copyWithZone: 方法
- (id)copyWithZone:(NSZone *)zone
{
Student * stu = [Student allocWithZone:zone];
stu.name = self.name;
stu.sex = self.sex;
stu.age = self.age;
return stu;
}
{
Student * stu = [Student allocWithZone:zone];
stu.name = self.name;
stu.sex = self.sex;
stu.age = self.age;
return stu;
}
OC内存管理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。