MRC
底层实现是否一样
- 自己生成的对象,自己持有
在iOS内存管理中有四个关键字,alloc、new、copy、mutableCopy,自身使用这些关键字产生对象,那么自身就持有了对象
// 使用了alloc分配了内存,obj指向了对象,该对象本身引用计数为1,不需要retain
id obj = [[NSObject alloc] init];
// 使用了new分配了内存,objc指向了对象,该对象本身引用计数为1,不需要retain
id obj = [NSObject new];
- 非自己生成的对象,自己也能持有
//NSMutableArray通过类方法array产生了对象(并没有使用alloc、new、copy、mutableCopt来产生对象)
//因此该对象不属于obj自身产生的
// 因此,需要使用retain方法让对象计数器+1,从而obj可以持有该对象(尽管该对象不是他产生的)
id obj = [NSMutableArray array];
[obj retain];
- 不需要自己持有的对象时释放
id obj = [NSMutableArray array];
[obj retain];
// 当obj不在需要持有的对象,那么,obj应该发送release消息
[obj release];
// 释放了对象还进行释放,会导致奔溃
[obj release];
- 无法释放非自己持有的对象
// 释放一个不属于自己的对象
id obj = [NSMutableArray array];
// obj没有进行retain操作而进行release操作,然后autoreleasePool也会对其进行一次release操作,导致奔溃。
后面会讲到autorelease。
[obj release];
MRC没有strong,weak,局部变量对象就是相当于基本数据类型。MRC给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋值,因为使用下划线是直接赋值(如_name = name),而set方法会多做影响引用计数方面的事情,比如retain。
MRC内存是怎么分配
-(void)setName:(NSString *)name
{
if(_name != name)
{
[_name release];
_name = [name retain];
//_name = [name copy];
}
}
-(NSString *)brand{
//将实例变量的引用计数加1后,添加自动减1
//作用,保证调用getter方法取值时可以取到值的同时在完全不需要使用后释放
return [[_brand retain] autorelease];
}
//MRC下 手动释放内存 可重写dealloc但不要调用dealloc 会崩溃
-(void)dealloc{
[_string release];
//必须最后调用super dealloc
[super dealloc];
}
网友评论