A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张文文 中级黑马   /  2015-1-26 20:09  /  2459 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  现在版主给分都是扣自己的分,我的分也所剩不多了,有送不到的同学不要生气。  至于25分才分配入学名额这个要求,只是为了让大学在论坛活跃一下,体验学习之外一起交流的互动。其实,拿技术分没有什么捷径,只有自己每天在论坛发帖,回复获得黑马币再换取技术分。想进入黑马培训,我相信也不是十天八天就可以走完那些流程的(基础很棒的可以忽略这句)。所以,也不要想一口吃个胖子,循序渐进慢慢来,对自己也是有好处的。
题目:谈一下对OC内存管理的理解(ARC、非ARC都可以)




17 个回复

倒序浏览
移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象、变量等 管理范围:任何继承了NSObject的对象,对其他基本数据类型(int、char、float、double、struct、enum等)无效

评分

参与人数 1黑马币 +5 收起 理由
张文文 + 5

查看全部评分

回复 使用道具 举报
苹果的内存有限,为了更好的用户体验,需要手动管理内存,内存对程序员是个很敏感的话题。还没接触到,只是大概的了解。才看到C语言

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3 神马都是浮云

查看全部评分

回复 使用道具 举报
关于ARC:
1.ARC是自iOS5之后增加的新特性,完全消除了手动管理内存的繁琐。编译器自动在适当的地方插入适当的retain、autorelease语句,ARC是编译器特性,因此ARC和手动管理内存性能是一样的,。由于编译器还可以执行某些优化,所有有时还能更加快速。
2.ARC的判断规则:只要没有强指针指向对象,就会释放对象。
3.强指针:默认情况下,所有的指针都是强指针,__strong;弱指针:弱指针指向的对象被释放时,弱指针会自动变成nil指针,__weak。
4.使用注意:不能调用retain、(auto)release、retainCount;可以重写dealloc,但不能调用[super dealloc]。

评分

参与人数 1黑马币 +5 收起 理由
张文文 + 5

查看全部评分

回复 使用道具 举报
对象中有一个引用计数器,当对象被引用时这个值就加一,release则减一,你初始化一个对象的时候这个对象的引用计数就为1。当对象的引用计数为0的时候系统就知道这个对象每人使用了,就销毁它释放资源。就跟你去图书馆借书一样,借了是要还的。这是我的理解。。。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3 淡定

查看全部评分

回复 使用道具 举报
每个类在创造实例时都会在内存中给它划分一片区域用来存放对象,然后实例名指向该内存空间,如果这个对象不用了,这块区域就会被系统回收,抹掉内容或者覆盖上别的内容,objective c中没有java中那么强大的垃圾回收机制,网上有人称其为半自动模式,相当形象。我们通过“引用计数(reference couting)”来判断这个内存空间是否仍在使用呢,.当该对象创建时,该计数为1,说明有一个引用,如果不用时,就会减为0,这就表示不再使用了,那么就会销毁该空间。

后台不占用cpu但是占用运存,程序开多了会自动关闭一些程序腾出运存.------俗话说

如果对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease.------黄金法则

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3 看你技术分已满,加3分不要嫌少哦.

查看全部评分

回复 使用道具 举报
行我福 来自手机 中级黑马 2015-1-27 09:53:12
7#
OC的内存管理,有一条黄金法则:谁创建谁释放,谁retain谁释放。
在OC中,当对一个对象拥有控制权后,都需要进行释放,但是如何拥有对象的控制权呢?对对象进行了alloc、retain、copy操作后,我们拥有了对象的控制权,因此需要对其进行释
OC采用了引用计数(retain count)的方法。对象的内部保存一个数字,表示被引用的次数,使用alloc或者copy(或者new)方法创建一个对象时,其计数器的值为1

评分

参与人数 1黑马币 +5 收起 理由
张文文 + 5

查看全部评分

回复 使用道具 举报
松果 中级黑马 2015-1-27 12:22:24
8#
arc并不是垃圾回收,而是在程序编译时,编译器添加省略的内存回收代码

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
新建一个OC对象会在堆中申请一个空间,用一个指针变量指向该存储空间,并且对象内部会有一个引用计数器来指示该对象当前有多少个引用。如果对象之间的引用关系非常复杂,就很容易出现类似野指针、僵尸对象、空指针的问题,导致最后堆中的这一块空间没有释放,造成内存的浪费。有些程序编译链接都没有问题,但是运行的时候会闪退,很有可能就是因为内存管理不当引起的。内存管理的作用是防止程序的这种运行时错误。

评分

参与人数 1黑马币 +5 收起 理由
张文文 + 5

查看全部评分

回复 使用道具 举报
OC使用了(Retain Count)的机制来管理内存中的对象。
  在OC中每个对象都对应着自己(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息时,持有计数数值会增加。
相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
1,ARC 是编译器特性,并不是类似与java 的垃圾回收机制
2,ARC的判断规则:只要没有强指针指向对象,就会释放对象。
3, ARC完全消除了手动管理内存的繁琐。编译器会根据计数器来自动进行替换
2.ARC的判断规则:只要没有强指针指向对象,就会释放对象。
3.强指针:默认情况下,所有的指针都是强指针,__strong;
当用property自动生成set get 方法的时候 要加strong如果是循环引用的话就一边strong 一般weak
4  如果不用ARC的话则对于OC对象完全需要手动去管理内存,如果类的属性是方法的话则需要在set方法操作计数器  同时重写delloc 而最终对象进行了alloc、retain、copy操作是需要进行计数器的操作

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
系统资源都是有限的,会为每个程序分配一定的内存,超过内存系统将会终止你的应用程序,对你自己拥有的对象负责,你只能释放你拥有的对象,凡是通过retain,alloc,copy等手段获得了所有权的对象,都必须在你不在使用他的时候,由你来调用release,autorelease等手段来释放对他的所有权

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
1.OC的内存管理:谁创建谁释放,谁retain谁释放。
2.OC采用了引用计数(retain count)的方法。对象的内部保存一个数字,表示被引用的次数,使用alloc或者copy(或者new)方法创建一个对象时,其计数器的值为1

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
根本原因:对象和其他数据类型在内存的存储方式不一样,其他数据类型才在栈中,队形存放在堆中。当这块代码块结束时所有的局部变量也被内存回收,包括指针,而对象没有指针的指向,却依然存放在内存中,就造成了内存泄露。

所以管理对象应该依据 谁创建(new、alloc 、init、copy等)谁release、谁retain谁release的原则。

ARC机制:不允许调用release,retain,retainCount等 而是自动管理内存。
        好处是使开发人员专心去实现业务逻辑而不是冗杂的内存管理。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
ARC的出现,让我们可以不用再进行繁琐的内存管理,通过自动的方式,来避免因为书写遗漏等原因造成的内存回收不够彻底及时等问题。因此保证业务员可以将精力都放在业务上。是对业务人员的一种解放,有利于以后开发的软件的高质量。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3

查看全部评分

回复 使用道具 举报
1026238004 来自手机 中级黑马 2015-1-31 22:59:20
16#
我刚刚学到内存管理:lol
回复 使用道具 举报
版主,我分不够,现在参加活动行吗?

以下是我的理解
凡是nsstring,就用copy,定义一个模型对象,就用strong,只是赋值的,例如int、double、char 以及CGRect类似的就用assign。
非ARC 在.h文件中,@property 声明属性时,oc对象用retain,非oc对象用assign。
在ARC机制下, .h文件中,@property 声明属性时,OC对象用strong.  两个类之间相互引用时,一端用strong,一端用week.

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3 淡定

查看全部评分

回复 使用道具 举报
ARC对于刚学习oc的人来说是一个福利,你可以不需要有多少内存管理的知识,有系统替你管理内存。
但对于老手来说,ARC反而帮助不大,手动管理内存的优势是目前ARC技术所无法做到的。

评分

参与人数 1黑马币 +3 收起 理由
张文文 + 3 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马