Objective-C提供了三种内存管理方式:
MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手 动 retain、release、autorelease 等,而在其后的版本可以使用 ARC,让系统自己管理内存。)
automatic reference counting(ARC,自动引用计数,iOS5 之后推出的)
garbage collection(垃圾回收)。iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
Objective-C提供了三种内存管理方式:
MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手 动 retain、release、autorelease 等,而在其后的版本可以使用 ARC,让系统自己管理内存。)
automatic reference counting(ARC,自动引用计数,iOS5 之后推出的)
garbage collection(垃圾回收)。iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
引用计数器:
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数(有多少个所有者),即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
-
retain消息:使计数器+1,该方法返回对象本身。
-
release消息:使计数器-1(并不代表释放对象)。
使用注意:
规则:
- 如果你通过alloc,new,copy来创建了一个对象,那么你就必须对应的调用release或者 autorelease方法
- 当产生一个新的引用的时候, 需要将对象引用计数器 +1, 即调用对象的 retain 方法
Person *p2 = [p1 retain]
- 谁让对象retain的,就由谁release,即当某个引用不再指向该对象的时候,就需要将该对象的引用计数器-1,
#import <Foundation/Foundation.h>
#pragma mark - 电视
@interface Tv : NSObject
@end
@implementation Tv
@end
#pragma mark - 女孩
@interface Girl :NSObject{
Tv * _tv;//Tv作为Girl的成员变量
}
-(void)setTv:(Tv *)tv;//setter方法
-(Tv *)tv;//getter方法
-(void)dealloc;
@end
@implementation Girl
-(void)setTv:(Tv *)tv{
//girl取得tv时直接让tv retain
self->_tv = [tvretain];
}
-(Tv *)tv{
return_tv;
}
-(void)dealloc{
//girl释放时,让tv release
//谁retain,谁release:取得时retain,释放时release
[_tvrelease];
[superdealloc];
}
@end
int main(int argc,constchar * argv[]) {
//实例化Tv对象
Tv * tv = [Tvnew];
//实例化Girl
Girl * girl = [Girlnew];
//把tv传递给girl
girl.tv = tv;
//创建了对象,就要release
[tvrelease];
[girlrelease];
return 0;
}