OC-内存管理-常见错误

iOS混编实战:OC与Swift互调的核心步骤与避坑指南 本文详细介绍了在iOS项目中实现Objective-C与Swift相互调用的核心步骤与实战技巧。通过以集成Lottie动画组件为例,系统讲解了环境配置、桥接文件创建、使用@objc暴露Swift类、在OC中调用Swift组件以及在Swift中调用OC代码的全流程,并提供了数据类型转换、枚举结构体处理、性能优化等深度避坑指南,帮助开发者平稳高效地实现OC与Swift混编。 阅读详情

学习了OC中的内存管理,记录一下内存管理中常见的三个问题:野指针,内存泄露,内存过度释放。

首先,创建一个Person 类,完成属性设置,name ,sex,age  

再设置一个便利构造器类方法,来设置属性值

前提介绍完了,下面看一下常见错误代码:

第一个要介绍的是野指针错误,即指向一个你没有所有权的内存空间,并且该内容空间已经被释放

@autoreleasepool {

        

       Person *person = [PersonpersonWithName:@"jack"sex:@"man"age:22];

        [personsaySelf];

        [personretain];//2

       NSLog(@"%ld",[personretainCount]);

        [personrelease];//1

       NSLog(@"%ld",[personretainCount]);

        [personrelease];//0

       NSLog(@"%ld",[personretainCount]);

        //野指针 *person

        [personsaySelf];

}

前面已经释放了空间,但是指针没有指空,指向的空间是我们不可控制的,所以就会崩溃。

解决办法就是,使指针指空。

@autoreleasepool {

        

       Person *person = [PersonpersonWithName:@"jack"sex:@"man"age:22];

        [personsaySelf];

        [personretain];//2

       NSLog(@"%ld",[personretainCount]);

        [personrelease];//1

       NSLog(@"%ld",[personretainCount]);

        [personrelease];//0

       NSLog(@"%ld",[personretainCount]);

        //野指针 *person

        person =nil;

        [personsaySelf];

}


第二个问题就是内存过度释放问题:

@autoreleasepool {

       Person *person = [PersonpersonWithName:@"jack"sex:@"man"age:22];

        [personsaySelf];

        [personretain];//2

        [personretain];//3

        [personrelease];//2

        [personrelease];//1

        [personrelease];//0

        [personrelease];//过度释放

        [personsaySelf];

}

这个问题比较简单,就是对释放过的内存再次释放,导致崩溃。


第三个问题就是内存泄露,一道面试题,就是内存泄露问题,我们先来看问题代码:

@autoreleasepool

    {

       for (NSInteger i =0; i <100000000000000000; i++)

        {

            

           Person *person = [PersonpersonWithName:@"zhaozhao"               sex:@"girl"age:24];

            [personautorelease];

            

        }

        

        

    }

这道题是道典型的内存泄露问题,每一次申请空间都没有释放,仅仅是放入了自动释放池,这时候每个对象的引用计数器都是1,不是0,不会释放内存,而这个循环的条件很大,内存被申请完了,自动释放池还没有释放,导致了最后内存的泄露。


解决方案:

@autoreleasepool

{

   for (NSInteger i =0; i <100000000000000000; i++)

   {

            

       @autoreleasepool {

       Person *person = [PersonpersonWithName:@"zhaozhao"sex:@"girl" age:24];

                [personautorelease];

        }    //每一次创建都释放,就不会导致内存泄露

    }

}



还有一个问题就是常量区的引用计数无限的,无法被释放。来看一个例子:

@autoreleasepool {

        Person *person = [Person personWithName:@"jeff" sex:@"man" age:24];

         person = @"aaa";//常量区的引用计数为无穷大,无法释放

        [person release];

        NSLog(@"计数器 %ld",[personretainCount]);

}

当我们运行程序的时候会看到输出的引用计数器 为 -1。


接下来的一个问题就是指针的重定向问题引发的内存管理错误。

@autoreleasepool {

        Person *person = [Person personWithName:@"jeff" sex:@"man" age:24];

        person = [[Person alloc] init];

       [person release];// 0

        NSLog(@"计数器 %ld",[personretainCount]);

        [person release];//指针重指向新的堆 过度释放

        NSLog(@"计数器 %ld",[personretainCount]);

}

# 芯片良率是怎么算出来的?——从泊松到负二项分布,一个芯片测试工程师的视角 - 良率=好Die/总Die,但选错模型可能差17个百分点 - Poisson模型过于悲观,Murphy居中,**Negative Binomial才是业界标配** - 关键不是良率数字,是**跟踪聚类因子α的变化**——它能早几周预警工艺漂移 - Chiplet时代,10颗90%良率的Die封在一起,整体良率只有35% 阅读详情

相关推荐

MATLAB编程实战:通过SCPI命令高效读取普源示波器数据

本文详细介绍了如何利用MATLAB通过SCPI命令高效读取普源示波器数据,实现自动化测试与数据分析。文章从硬件连接到软件配置,再到核心代码编写与数据解析,提供了完整的实战指南,帮助工程师和科研人员摆脱手动操作,直接从示波器内存中精准读取数据,并利用MATLAB进行FFT频谱分析,大幅提升工作效率。

weixin_29176179的博客 544

OC内存管理之—自动释放池

自动释放池 1、新版的自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelease方法,那么当代码块执行完之后在块中调用autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法)。 2、也有别的版本使用如下格式建立自动释放池: ...

iteye_18817的博客 321

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 453

objective C程序 内存管理

内存管理 内存管理概念      由于移动设备的内存机器有限所以每个被占用的内存也是有限的。不用的内存是需要回收的,否则程序会崩溃      oc 管理内存的范围: 管理任何继承NSObject的对象,对其他的基本数据类型无效     基本数据类型数据占用的存储空间是固定的 一般存储在栈区。     对象类型是程序运行过程中动态分配的,存储在堆区,内存管理主要是 对堆区的对象 的内存管

pan_19931117的博客 401

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

恩智浦 S32K3xx 系列汽车微控制器器件具有 15 位分辨率逐次逼近模数转换器(SAR ADC),可用于模拟输入信号的采集和数字化。-15 位的分辨率。转换数据总是15 位宽,与所选转换分辨率无关(每转换数据 14、12、10、8 个有效位,减少这个数字会加快数据转换,因为 SAR 算法的执行步骤会更少)。-每个输入通道捕获的转换数据放在单独寄存器中。-可使用“ 平均法” 提高精度,即通过计算最高 32 次转换数据的平均数来提供最终结果。-正常转换触发转换多个。

梦想技术家 3844

win2016 php mysql_Windows Server 2016 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程 | 系统运维...

准备篇一、环境说明:操作系统:Windows Server 2016PHP版本:php 7.1.0MySQL版本:MySQL 5.7.17.0二、相关软件下载:1、PHP下载地址:2、MySQL下载地址:3、Microsoft Visual C++ 2010 可再发行组件包(安装MySQL需要此插件)4、Visual C++ Redistributable for Visual Studio 20...

weixin_34794420的博客 1377

iOS(4)OC中内存管理机制

程序运行过程中要创建大量的对象,OC中对象是存储在堆中的,系统不会自动释放堆中的内存。如果一个对象创建并使用后没有得到及时释放,那么就会占用大量的内存。 在C#中都有GC在自动管理内存,但是在OC中没有垃圾回收机制,那么OC中内存又是如何管理呢?其实在OC中内存的管理是依赖对象引用计数器(reference counting)来进行的。 OC中每个对象都有一个与之对应的整数,叫“引用计数器

chaungciy 663

GAMES101学习-第8课进行shader的初步了解

详细理解课上展示的像素着色器GLSL,以及了解了API、OpenGL、DirectX到底是什么,还有shadertoy这个网站的初步探索。

qq_41835314的博客 1917

OC_浅谈Object-C的内存管理机制

和C++一样通过内存操作获得的空间在使用完毕后需要释放内存否则就会造成内存泄露,接下来就让我们一起看看OC的内存管理机制; 首先我们知道oc的内存管理分为两部分:1、自动内存管理。2、手动内存管理。好,接下来我们就分别从这两个方面来探讨oc的内 存管理机制 在介绍具体具体的管理方法前,我先讨论一些概念性的问题: 1、对象:什么是对象? 标准定义:对象就是客观世界存在的人、事、物体等实体在

Core__Java的专栏 918

字节跳动已上岸测试工程师的面试经验

这个时候发面经已经有点晚了,所以现在打算让这篇面经主要面向即将秋招的童鞋,当然现在还在春招的童鞋也可以看哈,我和大家一起聊聊关于测试的二三事。   一、测试工程师的工作是什么?   测试工程师简单点说就是找bug,然后反馈给开发人员,不要小看这个工作。   首先很明显的bug开发人员有时候自己就能找到,测试人员要有比开发人员更加全面的想法才能找到深层次的问题点,   其次,要端正一个态度就是测试人员不是一个电脑小白,相反国外顶级的测试开发工程师同时也是顶级的开发工程师甚至更厉害,所以作为一个测试工程师一定要

m0_60745607的博客 2932

博途PLC PID仿真LSim_PT1库算法(一阶系统差分方程推导全过程)

博途PLC的PID仿真可以参看下面这篇博客,这篇文章我们主要论坛仿真库LSim的算法由来。如何利用博途PLC PID_Compact 进行PID仿真(一阶系统)_RXXW_Dor的博客-优快云博客博途PLC PID控制器 PID_Compact FB如何使用可以参看下面这篇文章,这里不再赘述。

RXXW_Dor的博客 2858

IOS第四节:OC中的内存管理机制

自动释放pool [autorelease方法和自动释放池] 每一个对象都有一个autorelease方法,调用autorelease方法之后不会像调用release方法一样马上释放对象, 当一个对象调用一个autorelease的时候,这个对象就会被放倒main函数开始时设置的自动释放池里 当整个函数执行完毕之后,autoreleasepool才会销毁,销毁时把自己内部所有的对象

u013370834的博客 442

硬件工程师的破局之路:为何你才是考取软考高级架构师的“天选之子”?

硬件工程师如何转型系统架构师:独特优势与实战路径 文章揭示了硬件工程师在考取系统架构设计师证书时的独特优势。作者指出,硬件工程师的全局思维、接口设计能力和可靠性经验正是系统架构的核心要素。通过将硬件经验升维为架构思维(从引脚到接口、从单板到系统、从实现到权衡),硬件背景反而成为竞争优势。文章建议通过知识补全、建立架构决策日志和术语转换练习来备考,并强调硬件工程师在软硬协同时代的独特价值——既能统领硬件设计,又能为软件搭建最佳舞台。文末鼓励硬件工程师以更高视野看待职业发展,将系统架构师认证视为水到渠成的职业升

云轩阁 532

OC 内存管理机制总结

一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创造的成员变量交由系统统一处理,不需要外部人员干预,有点像java中gc(垃圾回收机制)。 2)之前是没有自动内存管理机制的,后期苹果想拓展自己的开发市场,吸引其他平台开发者入住ios开发阵营,其中收到内存管理...

weixin_30446197的博客 121

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OC语言基础知识

OC语言基础知识 一、面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类。 术语:OO面向对象、OOP面向对象编程   二、类 (一)关于类 类的设计只关注三个东西:类名、属性和方法 注意:一般名词都是类,拥有相同属性和

软件工程班梁镋鑫的专栏 553

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OC内存管理(转载)

OC内存管理 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。 本质原因是因为对象和其他数据类型在系统中的存

duoduo_333的专栏 585

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关情纸尾-----OC-内存管理

一、引用计数器 1.整数,4个字节,表示对象被利用的次数 2.创建一个新对象时,新对象的引用计数器默认为1 3.当某个对象的引用计数器为0时,所占内存被系统回收 4.引用计数器的操作 retain +1 release -1 retainCount 获得当前引用计数器值 5.对象的销毁 ①引用计数器 0 ②系统自动发送dealloc给对象 ③...

weixin_30867015的博客 82

内存管理

ARC Automatic Reference Count 自动引用计数 MRC Manual Reference Count 手动管理内存堆空间 : 1.忘记释放 —> 内存泄露 2.提前/过早释放 —> 内存崩溃 3.多释放 —> 崩溃 C野指针 要遵守OC内存管理原则/法则 —-》黄金法则 //alloc/new

wangzhen3416的博客 273

Swift与OC互调指南:桥接文件配置与混合编程最佳实践

在iOS开发中,Swift与Objective-C的互调是每个开发者必须掌握的核心技能。无论是老项目的渐进式迁移,还是新项目中需要复用成熟的OC代码库,**Swift与OC互调**都显得尤为重要。本文将为你提供完整的桥接文件配置指南和混合编程最佳实践,帮助你轻松实现两种语言的完美协作!🚀 ## 📱 为什么需要Swift与OC互调? 随着Swift语言的普及,越来越多的iOS项目开始采用Sw

gitblog_09133的博客 453

1.1 OC类的认识

一.import的作用   功能和include一样,是将右边的文件拷贝到当前import的位置,为了降低程序员的负担,防止重复导入,避免程序员去书写头文件卫士:预处理指令,会自动防止重复拷贝 框架地址:工具箱地址 /Applications/Xcode.app/Conte...

weixin_30291791的博客 83

面试题

#import 跟#include、@class有什么区别?#import<> 跟 #import”"又什么区别? #import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次@class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题#import 用来包含系统自带的文件,#import “”用来包含自定义的

qiu_ggg的专栏 526

[黑马程序员]14[OC语言]OC内存管理部分学习笔记总结

OC内存管理   1.    内存管理基本概念+总结   // 内存管理管理范围:任何继承了NSObject的对象,对其他基本数据类型无效   // 栈空间的东西程序运行完毕会自动回收,对象是在堆空间的,必须手动回收   // 内存管理-02-引用计数器   // 每个OC对象都有自己的引用计数器,表示对象被引用的次数   // 每个对象都会专门分配4个

astina2011的专栏 446

IOS的UI基础01

内容大纲:(红色表示博主个人重点记忆) 1、指定启动界面 带箭头就是首次启动的页面2、两个常用的快捷键3、拖线子控件注意事项4、一般情况下,UIView的容器是控制器的View。5、didReciveMemoryWaring方法和loadDidLoad方法.6、View常见的方法。7、新建工程相关一览。8、项目文件一览。9、UI控件的内存管理10、关于Tag和自定义引用指针11、OC...

weixin_30501857的博客 75

OC内存管理

OC内存管理 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局

hahahacff的专栏 3万+

OC之内存管理

无论是ios还是android中,系统对每个程序运行时内存的占用都有一个限制,默认都是几十M左右大小,当程序占用的内存的大小超过限制时,程序可能就会被强制退出。 拿iphone4来说,当程序内存占用超过40M时,会出现内存警告,当内存占用达到45M,还会再一次内存警告,对于以上两次警告如果不做出释放内存操作,当达到120M时,系统会自动kill掉程序。 在内存中,分为堆和栈,栈中主要存放变量,

李峰峰的博客 1018

OC-内存管理

6-18 内存管理 1.C语言中,一个malloc必须只能对应一个free 堆空间需要手动释放。 C语言当中,只要涉及堆空间的使用,就要考虑释放问题;我们可以提供一个计数器来解决堆空间释放问题。多一个人使用,计数器加1;减少一个人使用,计数器减1;当计数器为0时,释放堆空间。 *****************************************************

King的专栏 1172
上一篇: NSObject class和NSObject protocol的关系(抽象基类与协议)
下一篇: JSON数据的解析
Net_Joe
博客等级 码龄12年 11粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值