内存管理

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,052评论 1 16
  • 自动引用计数 自动引用计数:指内存管理中对引用采取自动计数的技术。 内存管理/引用计数 持有对象引起引用计数加...
    南京小伙阅读 5,118评论 2 3
  • 1. 内总管理原则(引用计数) IOS的对象都继承于NSObject, 该对象有一个方法:retainCount...
    lilinjianshu阅读 6,478评论 0 2
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,006评论 8 119
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 5,453评论 1 3