再谈iOS中的内存

原创文章
声明:作者声明此文章为原创,未经作者同意,请勿转载,若转载,务必注明本站出处,本平台保留追究侵权法律责任的权利。
全栈老韩
全栈工程师,擅长iOS App开发、前端(vue、react、nuxt、小程序&Taro)开发、Flutter、React Native、后端(midwayjs、golang、express、koa)开发、docker容器、seo优化等。

内存

  1. 内存条里面,堆和栈的划分,通过弹性的扩展,一个从高位往地位进行存储,一个从地位往高位进行存储,直到堆和栈相交,形成了堆栈溢出。
  2. 对象存储在堆区
  3. 指针存储在栈区
  4. oc的对象本质是指针,指向一个结构体
复制代码
NSObject *objc = [[NSObject alloc] init];

oc的方法其实就是调用了c函数,上面的objc是一个临时变量,32位系统上占4个字节,64位系统上占8个字节

栈平衡:栈内存释放

内存泄漏:指针释放了,但是对应的存储区域没有被释放,那么系统就不会使用对应的这个存储区域,即造成内存泄漏。

野指针: 如果指针指向的内存区域free释放掉了,而指针在当前的函数中没有释放,并且又被执行到了,那么这个指针就变成了野指针。

dealloc: 当我们实例化一些非ARC管理的一些对象时,需要在dealloc中进行释放。

栈地址从高往低走,堆地址从低往高走。

  1. C里的create new copy默认都会开辟堆空间(malloc),返回一个指针

  2. 有时候苹果中常见的代码,如C结构体指针释放,不仅要free,还要执行release.

复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    
    CFRunLoopObserverRef observer;
    // 结构体里面,有可能再次开辟堆空间
//    CFRunLoopObserverCreate(<#CFAllocatorRef allocator#>, <#CFOptionFlags activities#>, <#Boolean repeats#>, <#CFIndex order#>, <#CFRunLoopObserverCallBack callout#>, <#CFRunLoopObserverContext *context#>)
    // 这个结构体的释放,如何释放;
    free(observer); // 意味着结构体指针对应的内存空间释放了
    CFRelease(observer); // 意味着结构体中开辟的空间被释放
}

叶子函数不会有栈空间,即最后一个函数,没有再往下调用.

暂无评论,快来发表第一条评论吧