IOS内存管理知识总结(一)

本文介绍了iOS开发中关于内存管理的基础知识,包括堆栈的区别、单例模式的应用及潜在问题,以及依赖注入的设计模式来减少内存泄漏风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近优化公司在优化app,总结几个内存管理的知识点。

    首先我们要清楚

    1. “堆”和“栈”

Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)
堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存

按管理方式分
  • 对于栈来讲,是由系统编译器自动管理,不需要程序员手动管理
  • 对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露
按分配方式分
  • 堆是动态分配和回收内存的,没有静态分配的堆
  • 栈有两种分配方式:静态分配和动态分配
    • 静态分配是系统编译器完成的,比如局部变量的分配
    • 动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理

    2. 单例模式

    单例模式是限制一个类只能初始化一个对象的一种设计模式,在实践中,初始化通常在程序启动不久后执行,而且这些对象不会销毁,原理想必大家都很清楚,单例对象被一个全局的静态变量所引用,保证了他不会被释放,每次调用都会先进行判断是否已经创建,一旦创建将不会再次创建

    正是因为单例的不会被释放,才有可能造成内存风险并且会增加程序的启动时间。下面是列举开发中的主要使用场景

  •     队列操作(如日志和埋点)
  •     访问共享资源(如缓存)
  •     资源池(线程池)

    所以在使用单例时候应该基本遵循一下原则:

  •     尽量不使用单例
  •     尽量避免对象级属性,尽量使用本地变量

    3 依赖注入

依赖注入的本质是在需要的时候传递依赖,我们可以先看下下面的例子

   -   (void)someMethod{   //外部类的方法

        XXSomeClass *obj = [XXSomeClass shareInstance];  //单例对象

        NSString *someValue = [obj operation:@"some parameter"];

    }   

很明显的发现 someMethod依赖了外部的类XXSomeClass,

  • 如果XXSomeClass在operation方法中又持有了一些资源,那么他会一直持有,哪怕shareInstance不会被调用。
  • 如果XXSomeClass需要在someMethod完成某些初始化,而上游调用someMethod的方法并不知道而直接使用XXSomeClass,会造成XXSomeClass并未初始化

这时候就需要依赖注入了,依赖注入可以通过自定义的初始化器或者调用方法注入。代码如下:

-(instancetype)initWithSomeClass:(XXSomeClass *) someClass{

        if(self=[super init]){

            self.someClass = someClass;

        }

        return self;

    }

-(void)someMethod{

    NSString *someValue = [self.someClass operaion:@"some parameter"];

}

-(void)anotherMethodWithAnotherClass:(anotherClass*) anotherClass{

       NSString *someValue = [anotherClass operaion:@"some parameter"];

}

欢迎大家讨论一个问题,方法在对象中如何存储,调用过程时如果对方法以及方法中的局部变量进行管理?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值