简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
OC中使用引用计数方式进行内存管理,提供了ARC和MRC两种内存管理机制.
在MRC中,与retain配对使用的方法是release,因为retain是使引用计数加1,release是使引用计数减1.
与alloc配对使用的方法是dealloc,alloc是开辟内存空间,dealloc是销毁所开辟内存空间.
readwrite,readonly为读写性控制.
readwrite是告诉编译器既声明getter方法又声明setter方法.
readonly是告诉编译器只声明getter方法
默认属性为readwrite.
nonatomic,atomic为原子性控制
nonatomic为非原子性,此时setter,getter方法内部不会做多线程处理,可以提高系统性能.
atomic为原子性,此时setter,getter方法内部会做多线程处理,此时需要不断的对setter,getter加锁解锁来保证线程安全,但会很占用系统资源,降低系统性能.
在MRC下使用retain,assign,copy进行语义设置.
assign内部实现为直接赋值,如下:
.h
{
NSInteger _age;
}
- (void)setAge:(NSInteger)age;
- (NSInteger)age;
.m
- (void)setAge:(NSInteger)age{
_age = age;
}
- (NSInteger)age{
return _age;
}
retain内部实现会做内存优化,如下:
.h
{
NSString *_name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
.m
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [name retain];
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}
copy是创建一个新对象,分深拷贝,浅拷贝两种,实现方式如下:
.h
{
NSString *name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
.m
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [name copy];
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}
在ARC中使用strong,weak进行语义设置,strong相当于MRC中的retain,weak相当于MRC中的assign.