由于内存管理部分较难理解,所以记录在此以备不时之需,如有错误和不足欢迎大家指正。
手动内存管理(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技术创建PDF演示文稿的命令行界面。 onepunch是为设计师设计的,它不提供任何默认样式。 设计人员可以编写CSS文件并将其链接到index.html 。 先决条件 要使用onepunch ,您应该在系统中安装了...
此扩展程序可以替换您在打开新标签页时看到的页面显示通知阅读和更改书签管理您的应用程序,扩展程序和主题更新1.1我们增加了第二季中看到的One Punch Man壁纸,例如Sa玉,Genos和Fubuki。 支持语言:English
这是One Punch Man Season 2 Wallpaper New Tab的延伸,这部动画令所有人赞叹不已 这是对“一拳超人”的扩展。 有史以来最酷的动漫。 如果您已经看过动漫,那么毫无疑问,您应该安装此One Punch Man Season 2 ...
在这个扩展中,你会发现一个冲床男子的主题壁纸。 如果您想更改标签,并且是“一拳超人”的爱好者和爱好者?因此,这些壁纸适合您。 支持语言:Deutsch,English,Français,español,italiano,português (Brasil),...
一个非常先进的域名管理软件,包括了Watch My Domains Professional(域名察看器),Domain Name Analyzer Professional(域名分析)等,支持监控与域名有关的网站,包括搜索引擎排名,ping和http页面监视,当域名...
聚贤阁1.1版发布 国内首个支持punchout的采购SaaS平台.pdf
语言:English 一种扩展功能,可以助您一拳! 单击图标可从一个打Kong人那里播放主题!
每个新标签页中的真棒高品质One Punch Man图像。 对于真正的粉丝,就像我一样:)您会非常有启发性的,并且您会喜欢这个不错的扩展。 简单易用(只需向下滚动即可查看更酷的照片或打开新标签)。 也可以离线工作。 ...
Java打斗拳击游戏punch源码,画质精细,这个不是android手机上的游戏,是以前的J2Me游戏,但是研究一下,对编写游戏还是帮助很大的,为编写IOS和Android游戏打下基础,本游戏源码完整,截图效果如上示。
模具设计
语言:English (United States) 在每个新的标签页上均包含动漫《一拳超人第2季》的高清图像。 适用于日本漫画和漫画迷。 在每个新的标签页上均包含动漫《一拳超人第2季》的高清图像。 适用于日本漫画和漫画迷。...
语言: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...
The Practice of Computing Using Python 2nd Edition by William F Punch and Ric
一拳超人New Tab壁纸和游戏,专为一拳超人而设计。 用一个很酷的一拳手新标签来更改您的新标签。 新建选项卡一拳超人壁纸自定义新选项卡扩展名会更改您的默认新选项卡。 功能:>快速拨号小部件,可访问您喜欢的网站...
用于 Punch 的 Sass 编译器在你的 Punch 项目中使用生成 CSS。如何使用安装包 npm install punch-sass-compiler打开您的 Punch 项目的配置 ( config.json ) 并添加以下内容: "plugins": { "compilers": { ".css": ...
与大多数其他后台处理库不同,Sucker Punch的作业存储在内存中。 这样做的好处是,没有其他基础架构要求(即数据库,Redis等)。 但是,如果在队列中剩余作业的情况下重新启动Web进程,则它们将丢失。 因此,通常...
Punch machine P6326冲床step
一个扩展泵,你的那一拳! 单击图标可从一个打Kong人那里播放主题! 支持语言:English