`
kakashi
  • 浏览: 23948 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

object c 内存管理

阅读更多

看了下官方文档的关于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它。
具体来看thingamajigsprockets方法的实现:
(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. 为什么要先retainrelease,因为如果newCountcount是同一个对象
先release的话会导致这个对象delloc.
分享到:
评论

相关推荐

    Object C 内存管理

    Object C 内存管理课件,关于一些内存管理机制 还有手动内存 引用计数操作的一些 小例子

    Object-C内存管理2-对象之间的内存管理

    在Objective-C中,内存管理是程序稳定性和性能的关键因素。Objective-C使用了一种称为自动引用计数(Automatic Reference Counting,简称ARC)的机制来帮助开发者有效地管理内存。本篇文章将深入探讨对象之间的内存...

    object-C内存管理

    在Objective-C中,内存管理是程序稳定性和性能的关键部分。Objective-C使用了引用计数(Reference Counting)机制,这是其内存管理的核心。本练习主要关注如何有效地使用和理解这个机制,以及ARC(Automatic ...

    object-c内存管理与实例

    在Objective-C中,内存管理是程序稳定性...通过阅读《内存管理教程-object-c》中的实例,你可以更深入地学习这些概念,并在实践中应用它们。记住,良好的内存管理习惯对于任何iOS或macOS开发者来说都是必不可少的技能。

    详细描述了Object-C中的内存管理,超级简单

    ### Objective-C中的内存管理 #### 引言 Objective-C是一种面向对象的编程语言,它结合了C语言的基础和Smalltalk的面向对象特性。在Objective-C中,内存管理是一项至关重要的任务,因为它直接影响到应用程序的性能...

    iPhone 应用开发中Object-C 内存管理--千锋培训

    iPhone应用开发中的Object-C内存管理是开发者必须掌握的关键技能,特别是在资源有限的移动设备上,如iPhone OS(现称为iOS)。内存管理不当可能导致程序崩溃,严重影响用户体验。Object-C的内存管理基于引用计数机制...

    《深入浅出发Objective-C》 内存管理.pdf

    Objective-C的内存管理是一种重要的编程技能,它对于创建出色的应用程序至关重要。...而随着Objective-C语言的发展,ARC为开发者带来了便捷,但在某些复杂场景下,依然需要开发者具备手动内存管理的能力和知识。

    Object-C语言教程.docx

    - Object-C是一种基于C语言的面向对象编程语言。 - 它的主要特点包括面向对象、动态性、扩展性、自动垃圾回收机制、C语言兼容性以及静态类型检查等。 - 在动态性方面,它允许在运行时修改类、对象的结构和行为,...

    C/C++内存管理机制

    Boost Pool提供了多种类型的内存池,如singleton_pool和object_pool,可以根据需求选择合适的内存管理策略。使用内存池可以显著提高内存分配和释放的效率,减少系统调用次数,降低程序的内存开销。 shared_ptr是C++...

    OBJECT C语言的资料

    2008年,苹果发布了Objective-C 2.0版本,这一版本带来了许多重要的改进,如内存管理方面的自动引用计数(ARC)、块(Blocks)等特性,极大地提高了开发效率和代码质量。苹果公司在2008年的文档中提到,Objective-C...

    《Object-Oriented Programming with Object C》 英文高清原版 PDF

    5. **内存管理**:Objective-C使用引用计数(Reference Counting)进行内存管理,`retain`、`release`和`autorelease`是控制对象生命周期的关键。后来引入的ARC(Automatic Reference Counting)自动处理大部分内存...

    python内存管理机制

    尽管不同的操作系统都提供了ANSI C标准所定义的内存管理接口,但是对于一些特殊情况,不同操作系统可能会有不同的行为。例如,当调用`malloc(0)`时,有的操作系统会返回NULL,表示内存申请失败;而有的操作系统则会...

    Object C扫描版PDF

    4. **内存管理** - **ARC(Automatic Reference Counting)**:Objective-C 2.0之后,垃圾回收被ARC取代,它自动管理对象的引用计数,避免内存泄露。 - **强引用(strong)**:默认的引用计数策略,保持对象的引用...

    Object-C基础教程

    Objective-C的自动引用计数(Automatic Reference Counting, ARC)负责对象的内存管理。当对象的引用计数为0时,系统会自动释放该对象,避免内存泄漏。 ### 7. Blocks Block是Objective-C的内联函数,可以捕获并...

    object C之计算器

    7. **内存管理**:Object-C使用引用计数机制进行内存管理,`retain`、`release`、`autorelease`等方法用于控制对象的生命周期,防止内存泄漏。 8. **错误处理**:在计算过程中可能遇到除零错误、溢出等问题,需要...

    Object-C教程

    Object-C是一种面向对象的编程语言,它是在C语言的基础上增加了面向对象的特性。Object-C最初由Stepstone公司于1980年代初开发,后来被苹果公司采用并进一步发展成为其主要的开发语言之一。在iOS和macOS的应用开发中...

    glibc内存管理ptmalloc源代码分析1

    #### 2.3 常见C内存管理程序 除了Ptmalloc,还有其他内存管理实现,如: - **Brk系统调用**:调整堆边界,是早期内存分配的主要方式。 - **Mmap系统调用**:直接映射文件或匿名内存,适用于大块内存分配。 ### 3....

    Object C语法快速入门

    7. **内存管理**: - ObjC使用引用计数来管理内存,对象的生命周期由其引用计数决定。创建、持有和释放对象是开发者需要注意的重要概念。 8. **分类与协议**: - ObjC允许通过分类(Category)为已有类添加方法,...

    ObjectC & Swift

    在iOS和macOS开发中,Objective-C(ObjectC)和Swift是两种主要的编程语言。Objective-C是苹果的早期开发语言,而Swift是2014年推出的新一代语言,旨在提供更现代、安全和高效的编码体验。这两种语言在很多项目中...

    Object-C pdf

    同时,Objective-C使用引用计数进行内存管理,了解ARC(Automatic Reference Counting)原理可以避免内存泄漏。 这份PDF文档应该详细讲解了这些知识点,并可能包含实践案例和练习,帮助初学者逐步掌握Objective-C,...

Global site tag (gtag.js) - Google Analytics