`
158067568
  • 浏览: 329556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

objc 内存管理

 
阅读更多

OBJC 内存管理

renren: www.renren.com/leonardozhang

基本知识

 

1.在oc中,对象也具有生命周期。其也有产生、生存(接受消息和执行操作)、交友(借助方法的组合和参数)、死去等属性。

 

2.Cocoa采用引用计数(reference counting)技术,来判断该对象是否达到生命周期终结。当某段代码需要访问一个对象时,该对象的reference counting 加一,当这段代码访问结束之后,rc 减1,当rc为0的时候,表示该对象不再有代码访问,可以被销毁,其占用的内存将被系统回收以便重用。

 

3.当使用alloc、new、copy方法创建对象时,其reference counting将被设置为1。使用retain,可以是reference counting加1,使用release 可以减少对象的保留计数器值。

 

4.当reference counting为0时,oc自动向对象发送一条dealloc消息。当然,你可以在类中重写该方法,以释放全部的资源。但是记住,一定不要调用dealloc函数。可以通过系统提供的一些方法,间接调用。查看reference counting,可以通过retainCount消息。

 

对象的所有权:

如现实世界一样,对象也有所属关系,如果一个对象具有指向其他对象的实例变量,则该对象拥有这些对象。同样,如果在一个函数中创建了一个对象,则称该函数拥有他创建的这个对象。

 

经常对遇到类似以下的情况:

 

main() 

{

...

[car setEngin:engin];

...

}

那么engin是属于main函数,还是car对象呢?如果是属于main函数,则main函数需要决定engin什么时候释放,但显然engin还在car对象中,这样main函数就不知道什么时候去释放该对象,显然engin不属于main()函数,或者更确切的说是engin不仅仅属于main()函数。

如果engin属于car对象,情况和刚刚所述类似,所以engin不仅仅属于他们中的任意一个。

其实在setEngin时,engin的reference counting已经+1,这样由main()函数负责释放一次,由engin函数负责释放一次。(此处需要验证,参考例子1,之后会设计一个程序来验证如上所述。

三青年之设置器(访问方法)写法

首先给出设置器的三种写法:

 

普通青年

- (void) setEngin:(Engin *)newEngine

{

[engin release];

engin = [newEngin retain];

}

 

文艺青年

- (void)setEngin:(Engin *) newEngin

{

[newEngin retain];

[engin release];

engin = [newEngin retain];

}

 

2B青年

-(void) setEngin:(Engin *) newEngin

{

engin = [newEngin retain];

}

 

首先解释2B青年,确实2到不想解释。

Engin *engin1  = [Engin new]; //count:1

[car setEngin: engin1]; //count:2

[engin1 release]; //count:1

如上面的注释,计数器最终没有清零,应为2B青年对newEngin retain但是没有release。造成内存泄露!!!

 

下面看看普通青年:

普通青年虽然首先对newEngin release了,但是如果有如下情况,普通青年比2B青年更2:

 

Engin *engin2 = [Engin new];

[car2 setEngin:[car1 engin]];

这次car2把car1的engin release了,这是计数器已经成0,即car1的engin已经被释放。然后又调用car1的engin赋值,这次直接造成崩溃。

 

最后看看文艺青年是怎么文艺的:

首先文艺青年先将newEngin 计数器加一,然后去释放engin,这样不管engin和newEngin是不是一个对象,都没有关系,因为先+1了,保证肯定大于等于2,然后去releae engin,在赋值。

 

 

 

 

 

 

 

 

 

0
2
分享到:
评论

相关推荐

    objc4源代码

    总而言之,通过阅读和理解objc4的源代码,开发者可以深入理解objc语言的底层运作,包括消息传递、内存管理、类和元类的关系,以及动态性等方面。这对于提升objc编程技巧、优化代码性能,甚至是进行框架和库的开发都...

    J2OBJC的demo

    J2OBJC会将Java的引用转换为Objective-C的强引用、弱引用等,以适应iOS的内存管理规则。 5. **运行时支持**:Java的反射、枚举等特性在Objective-C中没有直接对应物,J2OBJC会生成必要的运行时支持代码,以保证转换...

    实战 objc_setAssociatedObject

    在iOS开发中,`objc_setAssociatedObject`是一个非常...但在使用时需要注意内存管理,合理选择关联策略,避免内存泄漏。通过阅读`setAssociatedDemo`项目,你可以更深入地理解这一技术,并将其应用到实际的iOS开发中。

    objc4-750.1.zip

    5. **内存管理**:Objective-C使用引用计数(ARC)进行内存管理。`objc_storeStrong`、`objc_release`等函数是ARC背后的实现,它们确保了对象生命周期的正确管理。 6. **反射与元编程**:运行时提供了一系列API来...

    objc 中文+ 英文,快速上手

    对于更深入的学习,英文教程可能涵盖更多高级主题,如内存管理(ARC),Block,GCD(Grand Central Dispatch),以及UIKit等用于构建用户界面的框架。 ### 6. 学习资源 - Apple Developer官方文档:提供详尽的API...

    objc-高级编程

     《图灵程序设计丛书·Objective-C高级编程:iOS与OS X多线程和内存管理》在苹果公司公开的源代码基础上,深入剖析了:  iOS 5、OS X Lion 引入的新的内存管理技术ARC  iOS 4、OS X Snow Leopard 引入的多线程...

    Apple 可编译 objc 源码.zip

    自动引用计数(ARC)是Objective-C中的一项重要特性,它自动管理对象的生命周期,减少了手动内存管理的错误。 8. **Foundation框架与UIKit框架**: Foundation是iOS和macOS开发的基础,包含了许多基本的数据类型...

    Objc4--750

    3. **内存管理**:runtime提供了自动引用计数(ARC)和垃圾回收(GC)机制,用于管理对象的生命周期和内存分配。 4. **分类与协议**:runtime支持类别(Category)和协议(Protocol),使得在不修改原有类的情况下...

    [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObjec

    Objective-C 是苹果公司开发的一种面向对象的编程语言,它在 iOS 和 macOS 开发中起着核心...但需要注意的是,不恰当的使用可能会导致内存泄漏或对象生命周期管理的问题,因此在使用时应确保遵循正确的内存管理规则。

    通过 objc_setAssociatedObject (关联) 的形式实现为Category (类别) 添加属性

    如果需要线程安全的内存管理,可以选择`OBJC_ASSOCIATION_RETAIN`或`OBJC_ASSOCIATION_COPY`。 4. **注意点**:这种方式添加的属性不具备KVO(Key-Value Observing)功能,也无法参与归档和解档。如果需要这些特性...

    Objc中国 APP 架构 完整版

    9. 性能优化:内存管理、动画性能、后台任务处理等,提升用户体验。 通过学习《Objc中国 APP 架构 完整版》,开发者不仅可以了解各种架构模式的优缺点,还能掌握如何根据项目需求选择合适的架构,以及如何在实际...

    iPhone Mac Objective-C内存管理教程和原理剖析

    se]; //retain count = 1, obj1 释放...不过,随着 Swift 成为苹果平台的主要编程语言,虽然 Objective-C 仍然被支持,但学习 Swift 的内存管理(Swift 使用了类似的概念,如 strong、unowned 和 weak)也是很重要的。

    Objc (apple.com)

    - **运行时系统**:深入探讨 Objective-C 的运行时环境,包括内存管理、对象和消息传递等。 - **对象、类与消息**:解释对象的基本概念、类的定义及继承,以及消息发送机制。 - **协议**:介绍如何声明接口供其他...

    objective-c 内存管理Demo

    内存管理是编程中的核心概念,尤其是在资源有限的移动设备上。在Objective-C中,内存管理主要依赖于引用计数(Reference Counting)机制,后来在iOS 5.0引入的ARC(Automatic Reference Counting)自动管理了大部分...

    ObjC.pdf官方文档

    - GCD(Grand Central Dispatch)提供了一种更简单的方式来管理线程。 - 示例:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 要在后台队列中执行的任务 });` #### 十四...

    objective—c内存管理教程和原理

    ### Objective-C内存管理教程和原理 #### 前言 Objective-C作为一种面向对象的语言,在苹果的iOS和OS X开发环境中占据着重要的地位。其内存管理机制对于开发者来说至关重要,不仅影响到程序的性能,还直接影响到...

    iphone内存管理

    《iPhone内存管理详解》 Objective-C作为iOS应用开发的主要编程语言,其内存管理机制对于开发者来说至关重要。本文将深入探讨Objective-C中的内存管理基础,帮助初学者理解和掌握如何有效防止内存泄漏和程序崩溃。 ...

    objc4-756.zip

    3. **Memory Management**:内存管理的实现,如`retain`、`release`和`autorelease`的实现,通常在objc/objc-alloc.m和objc/objc-runtime.m中。 4. **Message Dispatch**:objc/message.mm包含了消息发送的实现,...

    iOS block实现,内存管理

    本文将深入探讨Block的实现以及与内存管理的关系。 Block可以视为匿名函数,它们在C语言的基础上进行了扩展。在Objective-C中,Block主要有以下几种类型: 1. **自动变量(Automatic Variables)**:Block内部可以...

    object-c内存管理与实例

    在Objective-C中,内存管理是程序稳定性和性能的关键部分。Objective-C使用了引用计数(Reference Counting)机制,直到iOS 5引入ARC(Automatic Reference Counting)后,内存管理变得更加自动化。本教程将深入探讨...

Global site tag (gtag.js) - Google Analytics