看了下官方文档的关于object c 的内存管理,总结下:
在iphone中object c 中的内存管理是通过计数器来管理的,每个对象内部都有一个计数器.新建一个对象,或者这个对象被其他对象引用,多会使计数器加1.Retain 增加计数器值release 减少计数器值.当计数器为0时对象就dealloc自己.
在object c中你生成的一个对象那么你就有责任去释放它,内存管理的一般规则:
-
You own any object you create by allocating memory for it or copying it.
Related methods:alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
-
If you are not the creator of an object, but want to ensure it stays in memory for you to use, you can express an ownership interest in it.
Related method:retain
-
If you own an object, either by creating it or expressing an ownership interest, you are responsible for releasing it when you no longer need it.
Related methods:release,autorelease
-
Conversely, if you are not the creator of an object and have not expressed an ownership interest, you mustnotrelease it.
考虑下面这个例子:
Thingamajig *thingamajig = [[Thingamajig alloc] init];
NSArray *sprockets = [thingamajig sprockets];
[thingamajig release];
thingamajig 需要release,因为很显然这里我们是thingamajig的owner。(第一条规则)
那么sprockets为什么不需要release呢。
首先我们不是sprockets的 creater.(第一条规则),我们也没有expressing an ownership interest,因为我们没有
retain它,(第二条规则) 所以我们不负责release它。
具体来看thingamajig的sprockets方法的实现:
(NSArray *)sprockets {
NSArray *array;
array = [[NSArray alloc] initWithObjects:mainSprocket,auxiliarySprocket, nil];
return [array autorelease];
}
可见分配的内存在方法里就已经用autorelease释放了,只不过是稍后释放。参见autorelease pool。
这里有个很重要的原则:
Becausethe classcreates the new object,itis responsible for disposing of the new object.
这个对象在哪里生成的,就应该在哪里释放。
所以你看到很多类有以自己类名为方法的构造函数,你调用的时候就不需要release.因为在这个构造函数中已经做
过autorelease了。
你没有alloc这个对象就不负责release它
现在来看规则2,有些时候我们在自己的类里要引用其他的对象,如把这个其他的对象变成自己的成员变量。
那么就有一个问题,这个被引用的对象是否被release不被你控制,一旦它被release,你自己的程序就会出问题
这时候我们就需要retain这个对象。表示你这个类也拥有这个对象,只有你自己的类release后,被引用的对象才有可能被release
一般的set 方法:
@interface Counter : NSObject {
NSNumber *count;
}
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[count release];
count = newCount;
}
在set中我们对传进来的对象进行了retain. 为什么要先retain后release,因为如果newCount和count是同一个对象
先release的话会导致这个对象delloc.
分享到:
相关推荐
Object C 内存管理课件,关于一些内存管理机制 还有手动内存 引用计数操作的一些 小例子
在Objective-C中,内存管理是程序稳定性和性能的关键因素。Objective-C使用了一种称为自动引用计数(Automatic Reference Counting,简称ARC)的机制来帮助开发者有效地管理内存。本篇文章将深入探讨对象之间的内存...
在Objective-C中,内存管理是程序稳定性和性能的关键部分。Objective-C使用了引用计数(Reference Counting)机制,这是其内存管理的核心。本练习主要关注如何有效地使用和理解这个机制,以及ARC(Automatic ...
在Objective-C中,内存管理是程序稳定性...通过阅读《内存管理教程-object-c》中的实例,你可以更深入地学习这些概念,并在实践中应用它们。记住,良好的内存管理习惯对于任何iOS或macOS开发者来说都是必不可少的技能。
### Objective-C中的内存管理 #### 引言 Objective-C是一种面向对象的编程语言,它结合了C语言的基础和Smalltalk的面向对象特性。在Objective-C中,内存管理是一项至关重要的任务,因为它直接影响到应用程序的性能...
iPhone应用开发中的Object-C内存管理是开发者必须掌握的关键技能,特别是在资源有限的移动设备上,如iPhone OS(现称为iOS)。内存管理不当可能导致程序崩溃,严重影响用户体验。Object-C的内存管理基于引用计数机制...
Objective-C的内存管理是一种重要的编程技能,它对于创建出色的应用程序至关重要。...而随着Objective-C语言的发展,ARC为开发者带来了便捷,但在某些复杂场景下,依然需要开发者具备手动内存管理的能力和知识。
- Object-C是一种基于C语言的面向对象编程语言。 - 它的主要特点包括面向对象、动态性、扩展性、自动垃圾回收机制、C语言兼容性以及静态类型检查等。 - 在动态性方面,它允许在运行时修改类、对象的结构和行为,...
Boost Pool提供了多种类型的内存池,如singleton_pool和object_pool,可以根据需求选择合适的内存管理策略。使用内存池可以显著提高内存分配和释放的效率,减少系统调用次数,降低程序的内存开销。 shared_ptr是C++...
2008年,苹果发布了Objective-C 2.0版本,这一版本带来了许多重要的改进,如内存管理方面的自动引用计数(ARC)、块(Blocks)等特性,极大地提高了开发效率和代码质量。苹果公司在2008年的文档中提到,Objective-C...
5. **内存管理**:Objective-C使用引用计数(Reference Counting)进行内存管理,`retain`、`release`和`autorelease`是控制对象生命周期的关键。后来引入的ARC(Automatic Reference Counting)自动处理大部分内存...
尽管不同的操作系统都提供了ANSI C标准所定义的内存管理接口,但是对于一些特殊情况,不同操作系统可能会有不同的行为。例如,当调用`malloc(0)`时,有的操作系统会返回NULL,表示内存申请失败;而有的操作系统则会...
4. **内存管理** - **ARC(Automatic Reference Counting)**:Objective-C 2.0之后,垃圾回收被ARC取代,它自动管理对象的引用计数,避免内存泄露。 - **强引用(strong)**:默认的引用计数策略,保持对象的引用...
Objective-C的自动引用计数(Automatic Reference Counting, ARC)负责对象的内存管理。当对象的引用计数为0时,系统会自动释放该对象,避免内存泄漏。 ### 7. Blocks Block是Objective-C的内联函数,可以捕获并...
7. **内存管理**:Object-C使用引用计数机制进行内存管理,`retain`、`release`、`autorelease`等方法用于控制对象的生命周期,防止内存泄漏。 8. **错误处理**:在计算过程中可能遇到除零错误、溢出等问题,需要...
Object-C是一种面向对象的编程语言,它是在C语言的基础上增加了面向对象的特性。Object-C最初由Stepstone公司于1980年代初开发,后来被苹果公司采用并进一步发展成为其主要的开发语言之一。在iOS和macOS的应用开发中...
#### 2.3 常见C内存管理程序 除了Ptmalloc,还有其他内存管理实现,如: - **Brk系统调用**:调整堆边界,是早期内存分配的主要方式。 - **Mmap系统调用**:直接映射文件或匿名内存,适用于大块内存分配。 ### 3....
7. **内存管理**: - ObjC使用引用计数来管理内存,对象的生命周期由其引用计数决定。创建、持有和释放对象是开发者需要注意的重要概念。 8. **分类与协议**: - ObjC允许通过分类(Category)为已有类添加方法,...
在iOS和macOS开发中,Objective-C(ObjectC)和Swift是两种主要的编程语言。Objective-C是苹果的早期开发语言,而Swift是2014年推出的新一代语言,旨在提供更现代、安全和高效的编码体验。这两种语言在很多项目中...
同时,Objective-C使用引用计数进行内存管理,了解ARC(Automatic Reference Counting)原理可以避免内存泄漏。 这份PDF文档应该详细讲解了这些知识点,并可能包含实践案例和练习,帮助初学者逐步掌握Objective-C,...