iOS内存管理

零基础搭建机械零件检测系统:基于YOLOv8的PySide6可视化开发全攻略 本文详细介绍了如何从零开始搭建基于YOLOv8的机械零件检测系统,涵盖环境配置、数据集准备、模型训练优化及PySide6可视化界面开发全流程。通过实战案例展示YOLOv8在工业检测中的高效应用,帮助开发者快速实现自动化零件检测解决方案。 阅读详情
前提
(1). 以下是针对cocoa对象,不包括core foundation
(2). cocoa对象都是用引用计数来跟踪对象的内存使用情况的。
(3). 在子类里面父类先初始化和后释放的原则。自己想下为什么

栈空间和堆空间的区别。
我们说的内存管理都是基于堆空间的,因为函数内的栈空间是由编译器自己控制的。 
关于core foundation的内存管理,在下下一次介绍。

内存管理主要是解决以下两个问题:
(1). 内存泄漏,内存泄漏就是不再使用的对象内存没有及时释放,导致程序内存使用过量,可能影响程序的效率,严重过量时可能导致程序被ios系统终止。
(2). 释放或者重写正在使用的数据。引发内存损坏,会让程序崩溃或者损坏

ios内存管理模型分为MRR( manual retain-release ) 和 ARC( Automatic Reference Counting ) 
MRR (手动retain和release)
你需要自己控制你拥有的对象的内存的分配和释放。
内存管理基本原则
(1).  你拥有你创建的任何对象(以下名称开头的方法,alloc,copy,retain,mutableCopy,new等)
(2).  你拥有你retain的对象
(3).  你必须释放你拥有的不再需要使用的对象(release)
(4).  你不能释放不是你拥有的对象。 
exp.

- ( NSString  *)fullNameOne
{
    
NSString  *string = [[[ NSString   alloc ]  initWithFormat : @"%@" ,  @"123" ]  autorelease ];
    
return  string;
}
- ( NSString  *)fullNameTwo
{
    
NSString  *string = [ NSString   stringWithFormat : @"%@ %@" , @"123" ,  @"hello" ];
    
return  string;
}
- (
NSString  *)fullNameThree
{
    
NSString  *string = [[ NSString   alloc ]  initWithFormat : @"%@" ,  @"123" ];
    
return  string;
}

以上第一种和第二种没有问题,第三种存在内存泄漏的可能,因为调用fullName的人并不知道返回的string使用完了还自己手动需要释放。
为什么第二种方式没有alloc,调用alloc和没有调用alloc有什么区别?读者仔细想下。

使用accessor方法来简化内存管理
@interface  Memory :  NSObject
@property  ( nonatomic ,  strong )  NSString  *username;
@property  ( nonatomic ,  weak )  IBOutlet UILabel  *usernameDisplayArea;
@end

#import  “Memory.h"
@implementation  Memory
@synthesize  username =  _username ;
@synthesize   usernameDisplayArea  =  _ usernameDisplayArea ;
@end ;

以上代码有几个地方需要,1. strong和weak 2.  @synthesize  username =  _username ;的含义。username是属性名,而_username是你成员变量的名字。使用时,self.username实际是调用你的属性username的getter方法,而_username仅仅就是在使用你的成员变量。
tip:
不要在init和dealloc种使用accessor方法,原因:因为在init时候,你的对象还没有构造完成,所以不能使用当前没有构造完成的对象,会有不确定的时候发生。
弱引用用得最普遍的是IBOutlet,所有的IBOutlet都是交给了storyboard和xib文件进行管理的。 


在MRR中,如何手写setter方法?

- (void)setUsername:(NSString *)newUsername

{

    NSLog(@"when call setter!");

    [newUsername retain]; //这个地方暗藏玄机,retain必须要在username的release之前,因为newUsername可能和username指向的同一个地方。

    [usernamerelease];

    username = newUsername;//指针的赋值,让他们两个指向同一个地方。

    //self.username = [myUsername retain]; //why here can not use self.username,这里会抛错误。因为使用self.username = xxx时候就是使用了setter

}

有两个点需要注意:
第一,如果属性是bool类型,那么getter方法的名字应该是isXXX,其他情况都是XXX
第二,setter方法,注意看上面这个setter方法。为什么不需要判断username是不是空呢?因为在oc中,发送消息给nil是没有问题的,不会发生任何事情。

以下代码有个小tip:
- ( NSString  *)getCurrentUsername:(Person *)person
{
    [person 
retain ];  //why need retain here …. 作用,当 person 传进来的时候, person 没有被释放,但是当我们正在使用这个对象的时候,这个 person 对象可能在外面被释放了,我们的程序会因此崩溃。因此为了防止意外释放,我们要先retain这个对象,确保我们使用的过程中不会出错。
    
NSString  *username = [NSString stringFormatWith: @"%@ living in room 32." , person.name];
    [person 
release ];
    
return  username;
}
tips:
如果发送消息给一个已经被释放的对象,程序会崩溃。
避免释放你正在使用的对象,需要注意以下两个情况
1. 当一个对象从一个基础的集合中释放时
2. 当对象的父对象被释放时 

autorelease 是延迟发送release消息给你的对象。最近一层的autorelease pool释放时,对应的release消息被发送。
autorelease pool 的问题,在arc中已经被@autoreleasepool{} blocks取代了。
autorelease 解决了以下几个问题: 
autorelease pool降低了应用程序的peak memory footprint,需要使用autorelease pool来管理产生的线程,因为线程保持自己的栈空间。

为避免过高的footprint,我们可以在分配适当量的临时变量后,drain掉pool。
- ( void )autoreleasePoolTest
{
    
NSAutoreleasePool  *pool = [[ NSAutoreleasePool   alloc ]  init ];
    
for  ( int  i =  0 ; i <  1000000 ; i++) {
        
NSString  *s = [[[ NSString   alloc ]  initWithFormat : @"%@" ,  @"poolTest" ]  autorelease ];
        
NSLog ( @"%@" , s);  //using some temp obj.
        
if  (i %  100  ==  1 ) {   //you can decide the number.
            [pool 
drain ];
            pool = [[
NSAutoreleasePool   alloc ]  init ];
        }
    }
    [pool 
drain ];
}


ARC 自动引用计数
取消了显示的retain和release,autorelease等,编译器在编译阶段自动插入了retain和release这些语句。
ARC的主要目的是希望开发人员投入更多的精力去关注自己要实现的功能,把你从内存管理的泥潭中解放出来。 

ARC中引入了弱引用(weak)。弱引用在对象还拥有强引用前能使用引用的对象。
弱引用主要是为了解决retain cycle 问题。循环引用的问题,对象之间相互拥有。
Cocoa建立了一个约定,父对象必须保持对子对象的强引用,子对象必须保持对父对象的弱引用

写得比较乱,因为是按照apple文档,边写边思考写的。
下一篇blog专门介绍ARC.


【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】 如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货! 阅读详情

相关推荐

iOS 性能监控(1)——CPU、Memory、FPS

前段时间,在公司的 App 中集成了一个性能监视器,效果如下所示。在这个过程中,扒了一些性能监测开源框架的源码,并学习了其中的原理。本文就对此做一些简要的总结。 image 概述 通常情况下,App 的性能问题并不会导致 App 不可用,但是会潜在地影响用户体验。比如:CPU 占用率过高会导致电量消耗过快,手机发热等问题。为了能够主动、高效地发现性能问题,避免 App 质量进入无人监控的状态,我们需要对 App 的性能进行监控。目前,对 App 的性能监控,主要分为线下和线上两种监控维度。 ...

feelinghappy的专栏 5629

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1675

IOS内存管理

1. 栈区(stack):由编译器自动分配释放,函数的参数值,局部变量等值。2. 堆区(heap):一般由开发人员分配释放,若不释放,则可能会引起内存泄漏。Objective-C提供了两种种内存管理方式:(MRC,手动引用计数器),(ARC,自动引用计数)。ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;

风·之痕的博客 8483

高德地图可视化入门:零基础用Python+高德API打造你的第一个热力图

本文详细介绍了如何使用Python和高德地图API从零构建商业级热力图。通过环境配置、地理编码、数据清洗到最终可视化展示的全流程指南,帮助开发者快速掌握地图可视化技术,特别适合展示商圈人流、疫情热点等地理分布数据。

weixin_29053067的博客 305

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 554

ios内存管理

​​​​​​​。

qq_43658148的博客 631

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

IOS开发-内存管理详解

在学习完我的文章之后相信你对内存管理和属性修饰符有更加清晰的认识,如果你喜欢我的文章,可以给我点个赞吗,谢谢

qq_52041970的博客 1679

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

DaVinci Developer和DaVinci Configurator:AutoSAR开发与配置工具

a. 组件创建:DaVinci Developer允许开发人员创建不同类型的AutoSAR软件组件,如应用软件组件(Application Software Component,SWC)、基础软件组件(Basic Software Component,BSWC)等。除了以上功能,DaVinci Developer和DaVinci Configurator还提供了丰富的文档和代码生成功能,以支持开发人员和配置人员进行文档编写、代码生成和文档浏览等任务。用户可以根据具体需求对软件组件进行灵活的配置。

HmoaAmp的博客 2262

【iOS开发】—— iOS内存管理

iOS内存管理

weixin_50990189的博客 3573

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

『iOS开发』 —— iOS内存管理

iOS内存管理 引用计数(Reference Count) iOS的内存管理基于引用计数这一机制,简单地说就是一个对象被其他对象持有时,引用计数+1,当不再被持有时-1,当引用计数减为零的时候对象不被任何人持有,就会被释放。 #### 内存管理的思考方式 * 自己生成的对象自己持有   `id obj = [[NSObject alloc] init];` * 不是自己生成的对象自己也能持有...

Peter_Huang0623的博客 800

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS中内存管理方案

系统提供的有不同的内存管理方案,大致有如下三种: TaggedPointer(对于一些小对象,比如说NSNumber,NSString等采用此种方案) NONPOINTER_ISA(64位架构下iOS应用程序) 散列表(散列表为复杂的数据结构,包含了引用计数表和弱引用表) TaggedPointer 以下2段代码能发生什么事?有什么区别? - (void)setName:...

小菜媛的博客 2737

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

iOS开发 - 内存管理

01、简介 内存是与CPU沟通的桥梁,计算机程序运行在内存,因此对内存的使用进行优化极为重要 02、内存管理说明 2.1 主要分类 内存管理主要分为自动内存管理和手动内存管理两大类 2.2 自动内存管理 2.2.1 由系统自动管理内存的方式,叫做自动内存管理 2.2.2 一些编程语言将自动内存管理称为垃圾回收,如Java

轻描淡写话程序 670

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

iOS的内存管理

前言 iOS的开发语言是Objective-C,也就是对C语言进行了面向对象的封装。所以理解iOS的内存管理,必然要先去了解一下C语言的内存管理,这样才会更透彻。 C语言的内存四区 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。后进先出(LIFO)。 堆区(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回...

pengf_wuxiaowu的博客 427

iOS高级理论:内存管理

在 iOS 应用开发中,内存管理是非常重要的一个方面,合理管理内存可以避免内存泄漏和内存过度消耗,提高应用的性能和稳定性。iOS 中的内存管理主要是通过引用计数(reference counting)和自动释放池(autorelease pool)来实现的。

长沙火山 1808

ios内存管理(整理篇)

iOS内存管理机制 前言 今天学习了IOS中的内存管理机制,其中一些片段是由其他文章搬过来的,我记得有篇文章是这样写到,站在巨人的肩膀上,我只是一个整理者加了一些自己的理解 为什么要学习内存管理 虽然 ARC 帮我们解决了引用计数的大部分问题,一些年轻的 iOS 开发者仍然会做不好内存管理工作。他们甚至不能理解常见的循环引用问题,而这些问题会导致内存泄漏,最终使得应用运行缓慢或者被系统终止进程。 ...

qq_43364806的博客 738

再论iOS内存管理

上次已介绍了内存管理,最近再总结一下内存相关知识 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html http://developer.apple.com/library/ios/#featuredarticles/ViewCo

Care iOS技术团队 1630

IOS 内存管理

001_IOS 内存学习总结

Scholar7的专栏 1951

【iOS】内存管理

本文系统梳理了iOS内存管理的核心机制,重点分析了内存分布模型、小对象优化、自动释放池等关键技术。内存分布方面,系统将3GB分配给五大区(栈、堆等)和保留区,1GB给内核区。小对象优化通过TaggedPointer技术实现高效存储,直接在指针中编码值数据,避免堆内存分配,提升3-100倍性能。自动释放池采用AutoreleasePoolPage双向链表结构,每页存储505个对象,通过哨兵对象界定释放范围,结合RunLoop实现内存自动释放。文章还深入解读了retain/release的引用计数管理逻辑...

2301_80095702的博客 1183
上一篇: 如何写出好代码
下一篇: iOS内存管理--ARC
MakeCodeClear
博客等级 码龄14年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值