怎么保证多人开发进行内存泄露的检查?
使用Analyze进行代码的静态分析。
尽量使用ARC环境开发。
非自动内存管理情况下怎么做单例模式?
声明一个单例对象的静态实例,并初始化为nil。
创建一个类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例。
实现NSCopying协议,覆盖allocWithZone方法,确保用户在直接分配和初始化对象时,不会产生另一个对象。
覆盖release 、autorelease、retain、reatinCount方法,以此确保单例的状态。
声明一个单例对象的静态实例,并初始化为nil。
static Singleton * sharedSingleton = nil;
创建一个类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例。
- (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
实现NSCopying协议,覆盖allocWithZone方法,确保用户在直接分配和初始化对象时,不会产生另一个对象 - (id) allocWithZone:(struct _NSZone *)zone
{
return [[self sharedInstance] retain];
}
(id) copyWithZone:(NSZone *) zone
{
return self;
}
覆盖release 、autorelease、retain、reatinCount方法,以此确保单例的状态。(id) retain
{
return self;
}(NSUInteger) retainCount
{
return NSUIntegerMax;
}
在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。
对于类方法默认是autorelease的,所有方法都会这样吗?
系统自带的绝大多数类方法返回的对象,都是经过autrolease的。
block在ARC和MRC中的用法区别,需要注意什么问题?
对于没有使用外部变量的block,不管是在ARC还是MRC下,都是NSGlobalBlock,这种类型的block可以理解为一种全局的block。不需要考虑作用率问题。同时,对他进行Copy或者Retain操作也是无效的。
循环引用问题。
什么情况下会发生内存泄露和内存溢出?
当程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积的多了,就会导致内存溢出。
当程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
自动释放池的底层实现?
自动释放池以栈的形式实现。当创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收后,他们从栈中被删除,并且会给池中里面所有的对象都会做一次realease操作。