看了下官方文档的关于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高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...
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...
此外,还可能包括更高级的主题,比如内存管理、多线程编程、框架的使用以及与其他语言(例如Swift)的交互等。通过学习教程,开发者可以掌握如何使用Object-C编写功能丰富的应用程序,并且能够理解和利用苹果的API...
5. **内存管理**:Objective-C使用引用计数(Reference Counting)进行内存管理,`retain`、`release`和`autorelease`是控制对象生命周期的关键。后来引入的ARC(Automatic Reference Counting)自动处理大部分内存...
尽管不同的操作系统都提供了ANSI C标准所定义的内存管理接口,但是对于一些特殊情况,不同操作系统可能会有不同的行为。例如,当调用`malloc(0)`时,有的操作系统会返回NULL,表示内存申请失败;而有的操作系统则会...
Objective-C的自动引用计数(Automatic Reference Counting, ARC)负责对象的内存管理。当对象的引用计数为0时,系统会自动释放该对象,避免内存泄漏。 ### 7. Blocks Block是Objective-C的内联函数,可以捕获并...
4. **内存管理** - **ARC(Automatic Reference Counting)**:Objective-C 2.0之后,垃圾回收被ARC取代,它自动管理对象的引用计数,避免内存泄露。 - **强引用(strong)**:默认的引用计数策略,保持对象的引用...
7. **内存管理**:Object-C使用引用计数机制进行内存管理,`retain`、`release`、`autorelease`等方法用于控制对象的生命周期,防止内存泄漏。 8. **错误处理**:在计算过程中可能遇到除零错误、溢出等问题,需要...
在内存管理方面,Object-C利用引用计数和自动释放池来控制对象的生命周期,防止内存泄漏和野指针的产生。而在自动引用计数(ARC)模式下,编译器会自动管理引用计数,进一步简化了内存管理。 在编程实践中,Object-...
ARC自动处理对象的内存管理,减少了内存泄漏和野指针的风险。 随着Swift语言的推出,Object-C在iOS开发中的地位逐渐被Swift取代。Swift由苹果公司自2014年起推广,旨在创建一个更安全、更现代的编程语言,同时保持...
Object-C是一种面向对象的编程语言,它是在C语言的基础上增加了面向对象的特性。Object-C最初由Stepstone公司于1980年代初开发,后来被苹果公司采用并进一步发展成为其主要的开发语言之一。在iOS和macOS的应用开发中...