`
liuonepunch
  • 浏览: 3894 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

刘 one punch的iOS开发日记 OC篇( 内存管理篇 )

阅读更多
  由于内存管理部分较难理解,所以记录在此以备不时之需,如有错误和不足欢迎大家指正。
  手动内存管理(MRC)部分:
  1.引用计数:生成一个对象的时候,将对象的引用计数记为1,每调用该对象一次引用计数就加一,不使用时便减一,只到引用计数为0并释放。
  2.当对象使用[p retain],[p alloc],[p new],copy,Mutablecopy方法时,均可以使retainCount加一。
    当对象使用[p release]时,引用计数减一,[p retainCount]可以查看引用计数。
  3.内存管理错误的几种类型:
      1.内存泄漏:对象在不使用时未释放
      2.野指针:对象提前释放
      3.僵尸对象:执行过度释放方法
  4.dealloc方法的使用:- (void)dealloc {self.dog = nil; [super dealloc];}
    该方法为引用计数为0时系统自动调用,不能手动调用  (具体实例下面会给出)
  5.关于对象所有权的问题:
      1.定义:如果一个对象内有指向其他对象的实例变量,则称该对象拥有这些对象。
      2.内存管理法则:谁申请,谁释放。
      3.正因为在多个实体中对象所有权关系复杂,所以要保留引用计数大于一。
        举例:在Car类中有- (void)setWheel:(Wheel *)newWheel;
        在main函数中调用该方法:Wheel * wheel = [[Wheel alloc] init];
                            [car setWheel:wheel];
        现在就出现了问题:如果wheel对象属于main函数,但Car类正在使用它,
        可如果属于Car类,又不敢保证之后main函数不会再使用这个对象。
        解决方法如下:让Car类保留wheel对象,并使引用计数器的值为2,
        这是因为main函数和Car类都在使用wheel这个对象,Car类应该
        在setWheel方法保留这个对象,main函数负责释放这一对象,当
        Car类完成其功能时再通过系统调用dealloc方法进行释放该对象。
  6.访问set方法中的保留与释放写法:
      1.如果我在set方法里写 wheel = [newWheel retain];则在main函数中
        以 Wheel *wheel1 = [Wheel new];  [car setWheel:wheel1];
        [wheel1 release];   会出现内存泄漏的错误,因为此时wheel的引用
        计数仍然为1,main函数释放了wheel1而Car类并未释放。
      2.如果我在set方法里写 [wheel release]; wheel = [newWheel retain];
        则在main函数中以 Wheel *wheel = [Wheel new]; Car *car1 =
        [Car new]; Car *car2 = [Car new]; [car1 setWheel: wheel];
        [wheel release]; [car2 setWheel: [car1 wheel]];  由于newWheel
        和wheel均指向刚释放的内存区,以至会引发错误。
      3.正确的写法之一:在set方法里写:[newWheel retain]; [wheel release];
        wheel = newWheel;  这样写的原因是首先保留新的wheel对象,就算两者是
        同一对象引用计数也会先加一,然后立即释放掉,再把newWheel赋给wheel,
        在set方法中先保留新对象,再释放对象就不会出现错误。
分享到:
评论

相关推荐

    onepunch:使用Web技术创建演示文稿的命令行界面

    onepunch是用于使用Web技术创建PDF演示文稿的命令行界面。 onepunch是为设计师设计的,它不提供任何默认样式。 设计人员可以编写CSS文件并将其链接到index.html 。 先决条件 要使用onepunch ,您应该在系统中安装了...

    One Punch Man Wallpaper Background New Tab-crx插件

    此扩展程序可以替换您在打开新标签页时看到的页面显示通知阅读和更改书签管理您的应用程序,扩展程序和主题更新1.1我们增加了第二季中看到的One Punch Man壁纸,例如Sa玉,Genos和Fubuki。 支持语言:English

    punch ball iphone游戏源码

    Xcode 3.2版本虽然相对较旧,但仍然支持iOS 4.x及以上的系统,对于Punch Ball这样的早期游戏来说,是其开发和调试的理想选择。在Xcode中,开发者可以利用Interface Builder设计用户界面,使用LLVM编译器优化代码,...

    One Punch Man Theme-crx插件

    使用方法非常简单,用户只需将One_Punch_Man_Theme.crx文件下载到本地,然后在浏览器的扩展管理界面进行安装。对于大多数Chrome浏览器用户来说,可以直接拖拽crx文件到浏览器的扩展页面完成安装。安装完成后,用户...

    One Punch Man Season 2 Wallpaper New Tab-crx插件

    这是One Punch Man Season 2 Wallpaper New Tab的延伸,这部动画令所有人赞叹不已 这是对“一拳超人”的扩展。 有史以来最酷的动漫。 如果您已经看过动漫,那么毫无疑问,您应该安装此One Punch Man Season 2 ...

    前端项目-jqueryui-touch-punch.zip

    在前端开发领域,jQuery UI 和 Touch Punch 是两个重要的工具,它们极大地丰富了用户与Web页面的交互体验。这里我们将深入探讨这两个技术以及它们如何协同工作。 **jQuery UI** 是一个强大的JavaScript库,它基于...

    高清壁纸一个冲床男人「HD Wallpapers One Punch Man」-crx插件

    在这个扩展中,你会发现一个冲床男子的主题壁纸。 如果您想更改标签,并且是“一拳超人”的爱好者和爱好者?因此,这些壁纸适合您。 支持语言:Deutsch,English,Français,español,italiano,português (Brasil),...

    聚贤阁1.1版发布 国内首个支持punchout的采购SaaS平台.pdf

    聚贤阁1.1版的发布标志着国内首个支持PunchOut技术的采购SaaS平台的诞生。在详细解析这个平台之前,需要了解几个关键知识点,包括SaaS(软件即服务)、PunchOut技术以及电商平台在采购场景中的应用。 SaaS(软件即...

    Domain Punch Professional v1.0.090604 特别版

    一个非常先进的域名管理软件,包括了Watch My Domains Professional(域名察看器),Domain Name Analyzer Professional(域名分析)等,支持监控与域名有关的网站,包括搜索引擎排名,ping和http页面监视,当域名...

    iphone冲球游戏源代码punch ball

    通过深入研究"Punch Ball"的源代码,我们可以学习到如何在iOS平台上构建一款功能完善的多人对战游戏,了解游戏开发中的核心技术和最佳实践。无论是对于初学者还是经验丰富的开发者,这款源代码都是一份宝贵的学习...

    GT400_HandPunch_C#_Punch_liond87_VS2019_

    【标题】"GT400_HandPunch_C#_Punch_liond87_VS2019_" 指的是一个基于C#语言开发的手掌识别系统(HandPunch),由开发者liond87使用Visual Studio 2019进行编译和构建。这个项目可能是一个用于员工考勤管理的应用...

    一个打孔人选项卡「One Punch Man Tab」-crx插件

    每个新标签页中的真棒高品质One Punch Man图像。 对于真正的粉丝,就像我一样:)您会非常有启发性的,并且您会喜欢这个不错的扩展。 简单易用(只需向下滚动即可查看更酷的照片或打开新标签)。 也可以离线工作。 ...

    Oracle Procurement Supplier’s Guide to Punchout and Transparent

    Oracle Procurement Supplier’s Guide to Punchout and Transparent Punchout 是一份专为供应商设计的指南,旨在解释如何在Oracle的采购系统中使用Punchout和Transparent Punchout功能。Punchout是一种电子采购技术...

    Java打斗拳击游戏punch源码

    Java打斗拳击游戏punch源码,画质精细,这个不是android手机上的游戏,是以前的J2Me游戏,但是研究一下,对编写游戏还是帮助很大的,为编写IOS和Android游戏打下基础,本游戏源码完整,截图效果如上示。

    Oracle Procurement Buyer’s Guide to Punchout and Transparent Pun

    Oracle Procurement Buyer’s Guide to Punchout and Transparent Punchout 是一份为使用Oracle采购系统的买家提供的指南,专注于两种电子采购技术:Punchout 和 Transparent Punchout。这些技术是企业间电子商务...

    broadleaf-punchout2go:为阔叶树打Kong集成

    【阔叶树打Kong集成】是针对Java开发的一个企业级解决方案,主要目的是为了实现B2B电子商务中的PunchOut(一键式采购)功能。PunchOut是一种允许企业用户直接从供应商的电子目录中进行采购的技术,使得企业采购流程...

    PUNCH塑料模具零件.pdf

    根据提供的文件内容,以下是对塑料模具零件的知识点详细说明: 1. 模具设计基础:模具设计是指在塑料成型加工过程中,为了获得所需形状的塑料制品,采用特定的材料,通过专门的加工方法制作出的成型工具的设计过程...

    One Punch Man Wallpapers and New Tab-crx插件

    语言:Bahasa Indonesia,Bahasa Melayu,Deutsch,English,Filipino,Français,Kiswahili,Nederlands,Norsk,Tiếng Việt,Türkçe,català,dansk,eesti,español,hrvatski,italiano,latviešu,lietuvių,magyar,polski...

    One Punch Man Season 2 New Tab-crx插件

    语言:English (United States) 在每个新的标签页上均包含动漫《一拳超人第2季》的高清图像。 适用于日本漫画和漫画迷。 在每个新的标签页上均包含动漫《一拳超人第2季》的高清图像。 适用于日本漫画和漫画迷。...

Global site tag (gtag.js) - Google Analytics