黑马程序员技术交流社区

标题: 第一期活动上线啦:速来抢答!!! [打印本页]

作者: Micro    时间: 2015-3-9 15:19
标题: 第一期活动上线啦:速来抢答!!!
本帖最后由 Micro 于 2015-3-9 23:52 编辑

     题目如下:
     请用自己的话来谈谈你对oc内存管理的理解。    

   根据答题情况给予奖励。奖励包括技术分与黑马币。小伙伴们噪起来!!!{:3_57:}
   活动要求:不得百度,不得复制粘贴。



作者: 煎饼果子超人    时间: 2015-3-9 15:47
本帖最后由 煎饼果子超人 于 2015-3-9 15:50 编辑

由于系统内存资源有限,内存管理是为了节省内存资源的使用,让程序更简练。一句话:使用完即释放,不占用多余内存空间。。。
作者: tripleCC    时间: 2015-3-9 15:55
感觉楼上说的不错,这里再唠嗑一句:自己造的孽(申请的内存),要自己来还(释放),总不能不能等别人来(系统)。。。
作者: 恋梦    时间: 2015-3-9 16:06
看了楼上的回答,我也是醉了,尼玛,我学了三天就了个造孽,加坑爹嘛。还不如说成欠债要还钱呢。

作者: vitanie    时间: 2015-3-9 16:07
OC的内存管理主要针对程序中已经无用的垃圾对象进行释放,防止占用空间,主要是原则总结如下:1.凡是使用alloc 、new、copy创建对象的必须调用relase或者autorelease去释放对象,二,除了alloc,new、copy创建的对象外的对象都是autorelease释放的,三谁retain,谁释放,内存管理重点注意僵尸对象、野指针的处理。不能给僵尸对象发送消息,否则就是内存访问错误。
作者: wenfeng340    时间: 2015-3-9 16:39
OC内存管理针对的是对象的分配内存到堆区占用的空间(就像C语言里面的动态内存分配,分配后是在内存堆区),若使用完后需要去释放   
但是需要注意的是对象创建的时候不能已匿名对象创建  不然在无法找到对象在内存的地址,也无法进行释放操作   总之一条原则是谁用完,谁就需要自己释放  
作者: zzyyzz1992    时间: 2015-3-9 16:58
oc内存管理最开始是纯手动的retain&release 后来有了autoreleasepool减轻了手动管理内存的步骤,最后有了ARC,终于可以彻底像Java一样不用太操心内存管理的问题了~
作者: 理工007    时间: 2015-3-9 17:18
OC内存管理针对的是对象的分配内存到堆区占用的空间(就像C语言里面的动态内存分配,分配后是在内存堆区),若使用完后需要去释放
但是需要注意的是对象创建的时候不能已匿名对象创建 不然在无法找到对象在内存的地址,也无法进行释放操作 总之一条原则是谁用完,谁就需要自己释放

作者: 喧闹的世界    时间: 2015-3-9 20:03
学习过java和c#,oc还没看到这块。根据我的理解,这几种语言在创建对象的时候会占据内存,而java特有的jvm有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。oc没有这种功能,所以需要我们自己找出垃圾对象,将其释放。
作者: zuoxiaorui    时间: 2015-3-9 20:29
OC内存管理:由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

oc内存管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。
作者: 粘糊浆    时间: 2015-3-9 21:54
我是0基础的,不知道OC内存管理与其它语言有什么区别。不边看了几天的0基础视频,感觉到了它的重要性。 有alloc ,就要有ralease. ,有始有终。
作者: 夜空守望者    时间: 2015-3-9 22:02
这个还真不知道啊
作者: hastar    时间: 2015-3-9 22:16
做男人就要拿的起(分配内存),也要放的下(释放内存),放不下就会累死(内存泄露)
作者: still过客    时间: 2015-3-9 22:38
对你自己拥有的对象负责,你只能释放你拥有的对象
凡是通过retain,alloc,copy等手段获得了所有权的对象,都必须在你不在使用他的时候,由你来调用release,autorelease等手段来释放对他的所有权
在一定的代码段内,对同一个对象所做的 copy,alloc和retain的操作次数应当与release和 autorelease操作的次数相等
可以在类的dealloc方法中释放你所占有的实例变量
对于便利构造器和访问起来说,你没有通过上面的这些手段获得对象的所有权,因此在这些情况下你无须对获得对象进行额外的释放操作
autorelease只不过意味着“预定延迟发送一条release消息”,当前的引用计数器并没有变
作者: 幸福弯弯转    时间: 2015-3-9 22:47
今天晚上刚好写了一个关于内存管理的博客,只写了一部分没有写完,CSDN正在审核中,明天发链接出来。
作者: macau    时间: 2015-3-9 23:02
简单的来说就是:移动设备上的资源空间存放是有限制的,我们不能无限制的存放,这时就引出内存管理,通过释放回收内存中不再使用的数据,来提高内存空间的利用率。oc中局部变量存放于栈中,对象存放于堆中,一段程序结束时就会回收程序里面的局部变量来释放空间。
作者: waterfox    时间: 2015-3-9 23:51
从JAVA角度来分析,如果有不再引用指向该对象,那么又没有方法去处理和清除,简称不可到达对象。我们称为占据内存的垃圾~。Java有内置的垃圾回收机制,但是c或者C++,没有这个功能,需要手动释放内存,如果没有释放的话,容易有bug,内存溢出等等
作者: waterfoxjie    时间: 2015-3-9 23:54
本帖最后由 waterfoxjie 于 2015-3-9 23:58 编辑

系统资源有限,会为每个程序分配一定量的内存,超过了一定的量便会收到内存警告,超过系统所分配的内存,系统将会终止你的应用程序。
OC内存管理的原则就是:对你自己拥有的对象负责,你只能释放你拥有的对象
采用的是“保留计数”机制,引用计数的主要接口

作者: love007    时间: 2015-3-10 09:40
只要还有人在使用某个对象,那么这个对象就不会被回收;只要你想使用这个对象,那么就应该让这个对象的引用计数器+1;当你不想使用这个对象时,应该让对象的引用计数器-1;当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
作者: 喧闹的世界    时间: 2015-3-10 11:21
版主大人,我又来乞求看看能不能加分了:http://bbs.itheima.com/thread-174785-1-1.html
作者: whqkgd5    时间: 2015-3-10 11:46
还没学到这里,哎。
作者: ideal    时间: 2015-3-10 12:55
谁Retain谁release
作者: sydie    时间: 2015-3-10 13:57
才刚开始学,感觉应该是内存是有限的,不能无限存放,通过释放回收不需要的数据,获得更多的空间。
作者: JunGamer    时间: 2015-3-10 14:30
刚刚看到这个附近  以前学习java 貌似高级点的语言内存是自己管理的。垃圾回收机制嘛。不需要我们操作。。

我们所创建对象,并持有对象都会占据内存空间,对象内部存在一个计数器初始时候为1,当被撤销时候为0调用dealloc。其中copy,alloc和retain的操作都会持有对象并导致计数器数值+1.对应-1的有release和 autorelease。。

如李老师讲的。。原则是调用谁释放。。注意copy alloc retain和release  aoturelease的对应。。同一段代码段内增减次数应该相等。。。。

浅见。。刚看完。。。
作者: madam    时间: 2015-3-10 14:53
提示: 该帖被管理员或版主屏蔽
作者: 华少code    时间: 2015-3-10 14:55
感觉是历史遗留问题,现在有arc,内存我(菜鸟)觉得没必要太关注了
作者: Ammar    时间: 2015-3-10 15:20


    每个OC对象都有一个自己的引用计数器,表示其被引用的次数,当对象被创建时,默认计数器值为1。每个OC对象内部都有专门的4个字节的空间存储计数器。若果要使用某个对象,就必须对该对象发出Retain消息,该对象内部的引用计数器就会+1。而相应的,若不用某个对象,就必须确保该对象所占用的内存空间被回收(节省珍贵的移动设备内存空间),即对该对象发出Release消息,该对象的引用计数器就会-1。retaincount可获取对象当前的引用计数器的值,当对象的引用计数器值为0时,对象被销毁,同时其所占内存空间被系统回收。一旦对象被回收,其所占的内存空间就不可使用,强行使用会导致野指针错误。
    OC内存管理的原则是谁上的厕所谁冲干净,曾经让某个对象的引用计数器+1,就该在最后让其-1。谁在开始alloc,new,copy创建的对象,谁在最后就要通过release或者autorelease释放内存。谁调用了retain方法,无论这个对象是如何生成,在最后都要通过调用release方法。
    release用于对于占用内存较大的对象使用,达到精确控制的效果,而autorelease的使用对于占用较小内存的对象来说,可以不用考虑什么时间释放对象。

作者: 安若宸king    时间: 2015-3-10 16:23
还没开始学习oc,但是我猜测是,oc会极大的优化内存,把用不到的内存尽可能的释放,以保证程序运行的流畅性。
作者: 雨漪    时间: 2015-3-10 17:32
刚开始看oc呢,没法拿黑马币了--
作者: 大白菜cabbage    时间: 2015-3-10 19:24
今天刚好看到OC的内存管理这里,就来说说我的看法吧.因为和JAVA不一样,JAVA是具有自己内存回收机制的,但是OC没有这个机制.
我们通常使用的移动设备,内存都比较有限,如果我们不进行内存回收,那么设备运行程序就会越来越卡,甚至闪退等等.
这时我们就需要回收我们程序中,已经不再使用的内存空间,比如一些不再使用的对象或者变量.
当然,这个收回还是得遵循一定的原则的:首先就是只要还有对象在使用这个内存空间,那么我们就不能进行回收,只要我们还需要使用这个对象,那么就应该让这个对象的内存计数器加1,当不用的时候,就减1.其次就是,谁创建了,谁来release,也就是说如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法,如果不是你创建的,
那么就不用你来管理.
再者就是只要你调用了retain,无论这个对象时如何生成的,你都要调用release.
大概我暂时理解就是这么多吧,总之就是有始有终,有借有还,再借不难.:lol




作者: Theshy    时间: 2015-3-10 21:01
谁创建,谁释放。如果通过alloc、new或copy来创建一个对象,那么你必须调用autorelease或在使用完成时调用release,不是你创建的,就不用你去释放。
作者: 夙夙    时间: 2015-3-10 21:28
首先,OC内存管理是针对手机内存紧张、内存泄露等情况而必须实施的。
用概念的方法来说,OC对象被引用的次数可以用整数来表示,我们将它称为引用计数器。
初始创建时,OC对象的引用计数器默认为1,当引用计数器为0时,表示OC对象销毁,此时我们就可以对该OC对象进行回收。
而引用计数器是否为0,是判断该OC对象是否可以回收的唯一依据。
另外,每个OC对象内部都有4个字节的引用计数器的存储空间。

作者: ocean45    时间: 2015-3-10 21:49
使用完即释放,不占用多余内存空间
作者: 粘糊浆    时间: 2015-3-10 22:36
让不用的内存及时加收,加快程序的运行,让程序更安全执行下去。
作者:  常洋洋    时间: 2015-3-11 07:40
简单来说,一句话,就是让最小的内存空间处理最多的事情!
作者: 铅笔头    时间: 2015-3-11 07:59
1.因为手机等设备内存有限所以我们要进行内存管理
2.内存管理我们主要是利用计数器来完成,这里出现了著名的僵尸对象!野指针!
3oc内存管理经过了手动自动arc的发展过程
4,谁retain,谁release
作者: adslunk    时间: 2015-3-11 10:05
还没学到内存管理,努力中TVT
作者: 粘糊浆    时间: 2015-3-11 11:12
我要看再一遍,给我加点分撒
作者: qianlongwuyong    时间: 2015-3-11 13:11
合理利用空间
作者: futaoheima    时间: 2015-3-11 14:55
优化内存,及时释放空间
作者: 时光计    时间: 2015-3-11 18:00
过河拆桥,就是这么任性的管理内存。
作者: hastar    时间: 2015-3-11 18:33
OC的内存管理机制和C++的有很大的区别,而且复制对象的时候其实是增加一个内核对象数,‘释放’的时候内核对象数减一,其实真正的释放是要等内核对象数为0的时候。因此我们必须保持申请和释放配对出现,我觉得OC的Autorelease自动释放机制非常好,能减少很多麻烦
作者: 枫宇翔    时间: 2015-3-11 18:40
进行内存管理是因为内存属于比较重要的资源,需要充分的利用,C语言、java语言中都有关于内存管理方面的设计。而oc内存管理由retain&release 到autoreleasepool减轻了管理内存的步骤,最后有了ARC,对于内存 可以放心了,不过,我们还是需要明白内存管理的原理,这非常重要
作者: 粘糊浆    时间: 2015-3-11 19:09
移动设备的内存极其有限,每个app所能占用的内存是有限制的,如果 不加强内存管理,设备就是崩溃。
当对象销毁后,不要使用野指针,会导致系统崩溃。
作者: 喧闹的世界    时间: 2015-3-11 20:37
@Micro,这个应该能加分吧?为了25我也是拼了http://bbs.itheima.com/forum.php ... p;page=1#pid1247478
作者: jun_2015    时间: 2015-3-11 23:05
七期 的什么时候招生结束啊?有人知道吗?
作者: sydie    时间: 2015-3-12 06:21
内存有限制,需要加强或者释放。
作者: 军团指挥官    时间: 2015-3-12 09:24
1、Objective-C类中实现了引用计数器,对象知道自己当前被引用的次数
2、最初对象的计数器为1
3、如果需要引用对象,可以给对象发送一个retain消息,这样对象的计数器就加1
4、当不需要引用对象了,可以给对象发送release消息,这样对象计数器就减1
5、当计数器减到0,自动调用对象的dealloc函数,对象就会释放内存
6、计数器为0的对象不能再使用release和其他方法
作者: 朱士龙    时间: 2015-3-12 09:55
之所有要有内存管理是因系统的内存有限,利用良好的管理机制可以有效的利用内存。
    内存管理就是说你要对自己的对象负责,在利用完自己的对象之后,要及时的清除不用的内存,而且只能释放自己的对象。释放可以通过调用release、autorelease来实现。
作者: 13hoop    时间: 2015-3-12 11:49
OC的内存管理个人觉得需要了解:首先,内存管理就是管理对象,本质是类似C语言对计数器数值的操作,不同于Java的垃圾回收;其次,谁alloc谁release,谁retain谁release;最后注意循环使用问题
作者: 粘糊浆    时间: 2015-3-12 18:39
请问再答题还有奖励没
作者: hero200521296bj    时间: 2015-3-12 19:08
还没看到内存呢
作者: 粘糊浆    时间: 2015-3-12 20:49
重要,但不是很重要吧
作者: 粘糊浆    时间: 2015-3-12 20:55
谢谢楼主的黑币了。  我今天 晚上要看到这里了。请楼主帮我留点技术分哟。
作者: qianlongwuyong    时间: 2015-3-14 09:38
努力学习中,我想内存管理应该和c语言的差不多,合理利用有限的内存,提高性能
作者: 粘糊浆    时间: 2015-3-15 16:41
手机的内存有限,每个程序默认只有大约25M的内存,如果超过了,系统就会警告,甚至强制关掉程序,造成闪退。所以内存管理是很重要的。
有alloc, new .copy,就要有对应的release 或者 autorelease. 有retain ,就有对应的release, 当对象不再使用时,就要及时 的回收。

作者: hellooc    时间: 2015-3-15 22:39
内存管理的对象就是程序中的实例对象,方法是通过引用计数来区分程序中有用和无用的对象并及时回收无用对象以释放其占用的存储空间来保证有限的内存资源不被耗尽。
作者: yyx1992    时间: 2015-3-21 00:13
本帖最后由 yyx1992 于 2015-3-21 00:15 编辑

其实我觉得只有一句话:有加必有减,一一对应;
详细就是:非ARC:通过retain,alloc,copy等创建对象时,引用计数器加1,那么必须有对应的release或者autorelease对计数器进行减 1操作;
宏观方面:如果方法中有对计数器进行加或减操作,那么调用方法的代码段无需对应的减或加操作。release不是销毁对象,而是对计数器减1;
autorelease自动回收池可以 创建无限个,可以嵌套,好处是不用关心对象的释放时间,不关心什么时候调用release,缺点不能精确控制,适用于占用内存较小的数据类型;
循环引用一个必须用retain,另一个则用assign
ARC:不是内存回收机制,只是自动生成了代码,减少了程序员的负担;
判断回收准则:只要没有强指针指向对象,就会释放对象
循环引用一个必须用strong,另一个则用weak
版主,给加点技术分呗,熬夜写了半天不容易啊
作者: sydie    时间: 2015-3-21 09:49
这个问题似乎是问过的。内存是有限的。我们在使用之后,需要释放内存。
作者: tianlin    时间: 2015-3-21 11:29
我觉得是   堆里的对象进行管理,以前xcode是要程序员自己管理内存,一个 alloc 引用计数器+1  对应一个release  引用计数器-1  ,一个retain 引用计数器+1   对应一个release 引用计数器-1,当 引用计数器=0时,内存就被收回  
作者: 王强~    时间: 2015-3-25 20:52
在xcode 5 之前内存管理确实是很变态的。因为内存有限,手机内存更有限,所以开发中将用不到的内存释放掉。开始之前需要人为管理,alloc copy retain new  用来创建内存,release 用来释放,但是这要太消耗精力了 ,所以就出现了 autorelease ,虽然比之前容易管理,但是autorelease 延迟释放还是会多消耗很多的内存资源,实在无语(java .net 垃圾回收太爽了)。xcode 5 后arc的出现就完全代替了我们管理内存,这样内存就必须要人为管理。垃圾回收????NO  ,其实是编译器会再适当的地方自动插入retain,release和autorelease消息。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2