1.属性的属性有哪些
a.读写特性:readOnly,readWrite,setter(指定setter方法的名),getter(指定getter方法的名)
注意:setter和getter属性一般用在返回值为BOOL类型的方法中,为该方法重新指定方法名
b.原子性:atomic,nonatomic,
c.语义特性:assign,retain,copy,strong,weak,unsafe_unretained,NotNull,null
注意:
copy:要遵循<NSCopying>协议的类,才能使用copy。
weak:弱引用会防止野指针异常。
unsafe_unretained:容易出现野指针异常的问题。
2.retain、copy、assign三种内部的实现
assign的setter和getter方法:
-(void)setter:(NSString *)string
{
_string = string;
}
-(NSString *)string
{
return _string;
}
retain的setter和getter方法:
-(void)setter:(NSString *)string
{
if(_string != string){
[_string release];
_string = [string retain];
}
}
-(NSString *)string
{
return [[_string retain]autorelease];
}
copy的setter和getter方法:
-(void)setter:(NSString *)string
{
if(_string != string){
[_string release];
_string = [string copy];//深复制,复制一份副本,retainCount的值不变
}
}
-(NSString *)string
{
return [[_string retain]autorelease];
}
内存管理的机制
讲解:iOS仅支持两种内存管理方式,MRC和ARC。我们内存管理主要讲一下MRC。对于MRC,内存管理的机制是:引用计数。一个对象可以被其他对象持有(拥有),被一个对象持有,我们认为这个对象的引用计数为1,被两个对象拥有,我们认为这个对象的引用计数为2。以此类推。当某个对象不再持有这个对象,我们认为这个对象的引用计数减少1,当对象的引用计数减少到0的时候,说明没有任何对象持有这个对象了,操作系统就会回收这个对象所占有的内存。
整个内存管理其实都在管理这个引用计数,持有一个对象的时候,需要让被持有的对象引用计数加1,当不再持有这个对象的时候,要让被持有对象的引用计数减1。只有对象引用计数为0,对象占用的内存空间才会被系统回收。如果在程序运行过程中,由于内存管理不到位,导致对象不再使用时引用计数还不为0,会引起内存泄露,累积到一定程度程序会crash。如果引用计数为0之后,还在使用这个被系统回收的内存空间,会产生野指针异常,程序通常立即crash。一个好的程序员,既不能让程序产生内存泄露,也不能让程序产生野指针异常。
面试题
1, 分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并
说明autorelease是什么时候被release的?简述什么时候由你负责释放对象,什么时候不由你释放?[NSAutoreleasePool release] 和[NSAutoreleasePool drain]有什么区别
2,、 说说下面关键词在内存管理的作用:alloc、init、copy、retain、release、autorelease、dealloc、retaincount?
3,简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?并区别strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain? 引用计数机制进行内存管理。
dealloc release 因为retain就要销毁 创建就要释放
readwtite : 可读写(设置器和访问器) readonly : 只读(访问器) assign : 只做赋值
retain,copy : 赋值并引用计数加1 copy : 拷贝并引用计数加1 nonatomic : 非原子性 anotamic : 原子性(保证多线程安全)
strong : 打开ARC时才会使用,相当于retain weak : 打开ARC时才会使用,相当于assign, 可以把对应的指针变量置为nil copy : 适用于接受了nscopy 协议的对象类型 assign : 适用于一般类型 retain : 适用于一般对象类型