[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fEE9_Xnlpai5Zun3TUCfvluTe55iOz2wFSX-mEcyTnJ0":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":12,"notice":12,"visitCount":28,"commentCount":29,"keywords":30},68,"2024-02-02T10:22:17.591Z","再谈iOS中的内存","## 内存\n1.  内存条里面，堆和栈的划分，通过弹性的扩展，一个从高位往地位进行存储，一个从地位往高位进行存储，直到堆和栈相交，形成了堆栈溢出。\n2.  对象存储在堆区\n3.  指针存储在栈区\n4.  oc的对象本质是指针，指向一个结构体\n\n```\nNSObject *objc = [[NSObject alloc] init];\n```\n\noc的方法其实就是调用了c函数，上面的objc是一个临时变量，32位系统上占4个字节，64位系统上占8个字节\n\n> 栈平衡：栈内存释放\n\n> 内存泄漏：指针释放了，但是对应的存储区域没有被释放，那么系统就不会使用对应的这个存储区域，即造成内存泄漏。\n\n> 野指针: 如果指针指向的内存区域free释放掉了，而指针在当前的函数中没有释放，并且又被执行到了，那么这个指针就变成了野指针。\n\n> dealloc: 当我们实例化一些非ARC管理的一些对象时，需要在dealloc中进行释放。\n\n> 栈地址从高往低走，堆地址从低往高走。\n\n1.  C里的create new copy默认都会开辟堆空间(malloc)，返回一个指针\n\n2.  有时候苹果中常见的代码，如C结构体指针释放，不仅要free，还要执行release.\n\n```\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    \n    CFRunLoopObserverRef observer;\n    // 结构体里面，有可能再次开辟堆空间\n//    CFRunLoopObserverCreate(\u003C#CFAllocatorRef allocator#>, \u003C#CFOptionFlags activities#>, \u003C#Boolean repeats#>, \u003C#CFIndex order#>, \u003C#CFRunLoopObserverCallBack callout#>, \u003C#CFRunLoopObserverContext *context#>)\n    // 这个结构体的释放，如何释放；\n    free(observer); // 意味着结构体指针对应的内存空间释放了\n    CFRelease(observer); // 意味着结构体中开辟的空间被释放\n}\n```\n\n> 叶子函数不会有栈空间，即最后一个函数，没有再往下调用.","iOS中的内存相关知识，堆和栈的关系，以及oc是如何处理内存的。","",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",3,{"id":24,"name":26,"parentId":21},"iOS",[],33,0,"ios,ios memory,ios stack,ios heap,ios堆,ios栈,堆栈"]