内存管理的常见错误

内存管理常见错误

没有改为自动管理内存

解决方法:

野指针问题

[Person retainCount]: message sent to deallocated instance 0x1002032d0 消息发送给一个已经回收的对象

野指针异常现象:可能会崩溃,也可能不会崩溃,写到某一行代码时突然崩溃(没有写任何和引用计数相关的代码)原因:该对象的空间,已经被系统回收,不能访问没有所有权的对象解决方案:空间被系统回收之后,禁止访问
 或者令其指向无效空间

过度释放

过度释放现象:当调用内存引用计数减一有关的操作后,程序立即崩溃.原因:空间被系统回收之后,不能再做和引用计数减一有关的操作,否则会立即崩溃解决方案:删除多余释放语句

当引用计数为零时,系统会自动回收内存,我们只管理引用计数

@autoreleasepool的使用原则     @autoreleasepool {        Person *person
= [[Person alloc] init];//0-1

[person retain];//1-2        NSLog(@"%ld",
[person retainCount]);        @autoreleasepool {                       
[person autorelease];//2-1                    }autorelease,会将声明为autorelease的对象放入离他最近的自动释放池中,当自动释放池销毁时,会向池中的每一个对象,发送一个release消息

当该类型的对象引用计数为零时,系统会自动调用该类的dealloc方法来回收空间,该方法是由系统自动调用,不能手动调用验证对象,空间有没有没回收,只要查看该类的dealloc方法有没有执行即可,如下-
(void)dealloc{       NSLog(@"dealloc,你完蛋了,空间回收了");   
[super dealloc];    }

内存管理基本原则:如果你对一个对象进行alloc retain copy之后,你就具有了该对象的所有权,你就必须对它进行release或者autorelease.(只要调用了alloc
retain copy,就进行release 或

者autorelease)

内存管理典型例子

1. 在一个对象的方法里面:假设name的语义特性为retain

self.name = [[NSString  alloc] initWithFormat:@“object”];

_name =[[NSString  alloc] initWithFormat:@“object”];

有什么不同吗?

self.name,是先给name赋值,会调用setter方法,setter方法内部进行了引用计数 + 1操作,因此它的引用计数为2

_name只是简单的赋值操作,因此引用计数不发生改变

2. - (void)setPeople:(NSString *)p{

self.people = p;

}

这段代码有什么问题。

会出现死循环,self.people会调用自己的setter,而self.people还处于setter方法内部,因此会出现死循环

3.有一个NSStirng类型,retain方式声明的name属性的setter方法内部每一行代码的作用?

- (void)setName:(NSString *)name {

判断原有对象和新对象是否是同一个对象,如果是同一个,就没有必要再重新赋值,否则会先release
再retain,就会变成野指针

if (_name != name) {       
释放保有之前对象的所有权        [_name
release];       
让实例变量 _name保有新的对象的所有权       
_name = [name
retain];    } }

时间: 2024-08-30 10:47:05

内存管理的常见错误的相关文章

JavaScript中易犯的小错误-------常见错误三:内存泄露

国庆放假,今天开始继续!!!!!!!!!!! JavaScript中易犯的小错误-------常见错误三:内存泄露 内存泄露在js变成中几乎是一个无法避免的问题.如果不是特别细心的话,在最后的检查过程中,肯定会出现各种内存泄露问题.下面我们就来举例说明一下:var theThing = null;var replaceThing = function () {     var priorThing = theThing;     var unused = function () {       

常见Key-Value存储系统的内存管理策略解析

Key-Value存储作为NoSQL存储的一种常见方式,提供了比SQL数据库更好的可扩展性和读写性能.比如当前开源最热门的Memcached和Redis:淘宝的Tair.腾讯的Cmem.Amazon的Dynamo等等,无论是做缓存还是持久存储,均使用内存作为主要存储介质,故内存管理策略就显得尤为重要了,是影响性能的重要因素. 这里从源代码层面对Memcached.Redis和UDC(腾讯以前用的一套KV持久化存储系统)的内存管理策略进行分析,3者的内存管理策略各不相同,其他KV系统也和这3种方法

错误的认识:不需要关心javascript和jquery的内存管理

低层次的语言,如C,具有低级别的内存管理命令,如:malloc()和free(),需要开发者手工释放内存.然而像javascript这样的高级语言情况则不同,对象(objects, strings )等创建的时候分配内存,当他们不在使用的时候内存会被自动回收,这个自动回收的过程被称为垃圾回收.因为垃圾回收的存在,让javascript等高级 语言开发者产生了一个错误的认识,以为可以不用关心内存管理.下面就重新认识一下内存回收的机制: 一.内存生命周期       不管什么样的编程语言,内存的生命

JAVA常见错误处理方法 和 JVM内存结构

OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemoryError有好几种情况,每次遇到这个错误时,观察OutOfMemoryError后面的提示信息,就可以发现不同之处,如: java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: unable to create

cocos2dx 3.1从零学习(四)——内存管理(错误案例分析)

本篇内容文字比较较多,但是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的.可能表达的跟正确的机制有出入,还请指正. 如果有不理解的可以联系我,大家可以讨论一下,共同学习. 首先明确一个事实,retain和release是一一对应的,跟new和delete一样. 1.引用计数retain release 这里请参考一下引用计数的书籍,肯定说的比我讲的详细. 简单一点理解就是,对new的指针加一个计数器,每引用一次这块内存,计数就加1.在析构的时候减1,如果等于0的时候就delete这个

转:JAVA常见错误处理方法 和 JVM内存结构

OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemoryError有好几种情况,每次遇到这个错误时,观察OutOfMemoryError后面的提示信息,就可以发现不同之处,如: java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: unable to create

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

1.6 内存管理

一. 内存管理简介 1. 为什么要有内存管理? 移动设备内存极其有限,而每个app所能占用的内存是有限制的. 以下行为都会占用内存 .创建一个OC对象 .定义一个变量 .调用一个函数或者方法 当app所占用的内存较多时,系统会发出内存警告,这时就需要回收一些不再使用的内存 如果app占用的内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验 2. 什么是内存管理 1> 所谓内存管理,就是对内存进行管理,涉及的操作有: .分配内存:比如创建一个对象,会增加内存占用 .清理内存:比如销毁一

内存管理策略

内存管理策略 在引用计数的环境下管理内存使用的基本模型是,通过在NSObject协议定义的方法和提供标准命名的方法.NSObject类也定义了一个方法"dealloc",当一个对象被释放时此函数被调用.本文介绍了您需要知道的,如何正确的管理内存在一个Cocoa程序,并提供了一些正确的使用实例. 基本内存管理规则 内存管理模型是基于对象所有权的.任何一个对象可能会有一个或者多个所有者.只要一个对象有至少一个所有者,那么它需要继续退出.当一个对象没有所有者时,系统会自动销毁它. 为了确保你