三种内存管理机制:
- 引用计数、
- ARC(自动引用技术)、
- 垃圾回收(在iphong和ipad中不能用)
内存管理的特点:
- 每个对象有一个或多个所有者,所有权表示对其指向的对象的引用计数>=1
- 当使用alloc new copy mutableCopy 创建对象时,拥有对象所有权 计数+1
- retain +1 retain count 为引用计数
- 当使用完之后需要放弃所有权 release,语句中一定要包括alloc new copy retain, 才需要release
- autorelease : 移交给autoreleasepool释放,延时释放
- dealloc:当对象retain count为0,系统会发送消息给dealloc释放对象的内存
- 平衡法则:在任何一个作用域内,要有retain count +-平衡
retain assign
@property(nonatomic,retain) NSString* name;
@property(nonatomic,assign) double real;
//assign作用于数据类型
//retain作用于对象 调用的是setter方法,避免重复调用
//相当于写法一
-(void)setName:(NSString*)aName{
[aName retain];
[name release];
name = aName;
}
//或者写法二
-(void)setName:(NSString*)aName{
if(name!=aName){
[name release];
name = [aName retain];
}
}
setter方法的使用
//setter方法内部不要使用self.name 否则会造成递归调用
//初始化方法里可以直接retain对象成员name
-(id)initWithName:(NSString*)aName{
if(self=[super init]){
name = [aName retain];}
}
//其他地方尽量使用.name方式赋值
dealloc方法
凡是把对象成员作为数据成员的类一定要重载dealloc方法
因为在对象初始化时对象成员被计数两次,故需要dealloc来平衡
-(void)dealloc{
self.name = nil;//aName临时对象被释放以后,对象成员被release(调用setter),并且指针被置为空,避免野指针
[super dealloc];
}