内存管理

怎么保证多人开发进行内存泄露的检查?
使用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操作。

你可能感兴趣的:(内存管理)