`
158067568
  • 浏览: 326944 次
  • 性别: 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
分享到:
评论

相关推荐

    objc-高级编程

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

    objc4源代码

    objc语言源代码。阅读时可以先浏览一下所有的runtime API,就可对objc语言的实现原理有大致的了解,后续阅读才会更清晰。

    Accessorizer for mac

    Accessorizer是一个免费、容易使用的程序和服务的实施产生ObjC方法获得申报书及声明变量...Accessorizer提供范围广泛的内存管理方案,采用最着名的专家。Objective-C可可/这个包包括连接到重要的内存管理文章和资源。

    analyse-objc-source-code:objc4-723原始解析-源码解析

    analyse-objc-源代码 objc4-723原始解析 博客地址: objc原始码解析一:类的结构及初始化 objc原始码解析二:对象的内存管理

    mulle-clang::ID_button:用于mulle-objc的Objective-C编译器

    mulle-clang 这是一个基于clang 10.0.0的Objective-C编译器,是为运行时编写的。 它对应于mulle-objc-runtime v0.17或更高版本。 有关的更多信息,请... 您不能执行显式的内存管理(如-dealloc , -autorelease ,

    内存管理面试题1

    1.Dealloc 调用流程 1.首先调用 _objc_rootDealloc() 2.接下来调用 rootDealloc() 3.这时候会判断是否可以被释放,

    iphone开发进阶

    iphone开发进阶 简要介绍iphone os的4个主要部分组成、OBJC的内存管理、归档、容器; 定制UIButton、视图切换、屏幕的触摸事件检测、使用SQLLite连接数据库等等

    Object-C语言教程.docx

    在内存管理方面,Objective-C支持自动垃圾回收机制,可以自动管理内存释放,减少内存泄漏的可能性。 Objective-C是在C语言的基础上进行扩展的,因此可以直接调用C语言的函数和库。这使得Objective-C既具有C语言的...

    RRViewControllerExtension:UINavigationBar外观管理,内存泄漏检测,便捷的UIViewController属性和方法

    一个轻量级的UIViewController类别扩展,用于UINavigationBar外观管理,视图控制器推送/弹出/关闭管理,内存泄漏检测以及其他方便的属性和方法。 好处包括: 优雅地管理UINavigationBar外观 自动viewController内存...

    object c/iphone 开发 试题

    16.内存管理 ①:程序A里有一段内存被成功申请完成之后,内存计数器就从0变为1 (这个过程是alloc); ②:然后程序B里也要使用这个内存,那么内存计数器从1变为2 (这个过程是retain); ③:紧接着程序A不需要这个内存...

    Android代码-study

    Generics(泛型), Collection(集合类型), POP(协议式编程), Memory Management(内存管理): 增加HTML 转原生 HTN 项目开发记录: 增加深入剖析 WebKit : 增加深入剖析 iOS 性能优化: 增加了用 Swift 编写的工程...

    iOS 中weak的实现代码示例

    接下来,我们会从 objc 库中的 NSObject.mm、 objc-weak.h 以及 objc-weak.mm 文件出发,去具体了解 weak 的实现过程。 weak 的内部结构 Runtime 维护了一个weak表,用于存储指向某个对象的所有weak指针。weak 表是...

    Objective-C中的Block

    在这篇笔记开始之前,我们需要对以下概念有所了解。注:这里所说的堆和栈与数据结构中的堆和栈不是一回事。...对于堆区的管理是采用链表式管理的,操作系统有一个记录空闲内存地址的链表,当接收到程序分配内存的申

    iOS面试问题答案:针对J-Knight的面试题,写一下自己的理解

    内存管理 数据持久化 多线程 属性修饰符 内存语义。。。。 关于中高级的问题,我会随后做仔细的分析,我心里并没有十足的把握,或许上面的回答也是分裂百出,但是希望各位同行能多多指教,指出我的不足,在此先行谢...

    ProtocolServiceKit:iOS组件通信解决方案(协议服务),Adapter Swift && OC

    可多端同轴(方便地统一管理多平台的路由规则) :check_mark_button: 缺点:需要注册维护URL表,编译阶段无法发现潜在的BUG :male_sign: 注册存在内存占用问题 传参方式有限,并且无法利用编译器进行参数类型检查,...

    JHBlog:iOS开发:我的初级到中级的晋级之路

    JHBlog iOS文档 GNUstep是GNU计划的项目之一,它将Cocoa的OC库重新开源实现了一遍 源码地址: 虽然GNUstep不是苹果官方源码,但还是具有一定的参考价值 iOS底层 7、RunLoop实现原理 ...10、内存管理 10.1、定

    全面解析Objective-C中的block代码块的使用

    我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放。其操作方式类似于数据结构中的栈,即后进先出、...

Global site tag (gtag.js) - Google Analytics