P12

  iphone_内存管理 文档

iPhone/MacObjective-C内存管理教程和原理剖析初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,写了这么一个由浅入深的教程。希望对大家有所帮助,也欢迎大家一起探讨。此文涉及的内存管理是针对于继承于NSObject的Class。一基本原理Objective-C的内存管理机制与.Net/Java那种全自动的垃圾回收机制是不同的,它本质上还是C语言中的手动管理方式,只不过稍微加了一些自动方法。1Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。ClassA*obj1=[[ClassAalloc]init];2Objective-C的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。[obj1dealloc];这带来了一个问题。下面代码中obj2是否需要调用dealloc?ClassA*obj1=[[ClassAalloc]init];ClassA*obj2=obj1;[obj1hello];//输出hello[obj1dealloc];[obj2hello];//能够执行这一行和下一行吗?[obj2dealloc];不能,因为obj1和obj2只是指针,它们指向同一个对象,[obj1dealloc]已经销毁这个对象了,不能再调用[obj2hello]和[obj2dealloc]。obj2实际上是个无效指针。如何避免无效指针?请看下一条。3Objective-C采用了引用计数(refcount或者retaincount)。对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retaincount为2。需要销毁对象的时候,不直接调用dealloc,而是调用release。release会让retaincount减1,只有retaincount等于0,系统才会调用dealloc真正销毁这个对象。ClassA*obj1=[[ClassAalloc]init];//对象生成时,retaincount=1[obj1release];//release使retaincount减1,retaincount=0,dealloc自动被调用,对象被销毁我们回头看看刚刚那个无效指针的问题,把dealloc改成release解决了吗?ClassA*obj1=[[ClassAalloc]init];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj1hello];//输出hello[obj1release];//retaincount=0,对象被销毁[obj2hello];[obj2release];[obj1release]之后,obj2依然是个无效指针。问题依然没有解决。解决方法见下一条。4Objective-C指针赋值时,retaincount不会自动增加,需要手动retain。ClassA*obj1=[[ClassAalloc]init];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj2retain];//retaincount=2[obj1hello];//输出hello[obj1release];//retaincount=2–1=1[obj2hello];//输出hello[obj2release];//retaincount=0,对象被销毁问题解决!注意,如果没有调用[obj2release],这个对象的retaincount始终为1,不会被销毁,内存泄露。(1-4可以参考附件中的示例程序memman-no-pool.m)这样的确不会内存泄露,但似乎有点麻烦,有没有简单点的方法?见下一条。5Objective-C中引入了autoreleasepool(自动释放对象池),在遵守一些规则的情况下,可以自动释放对象。(autoreleasepool依然不是.Net/Java那种全自动的垃圾回收机制)5.1新生成的对象,只要调用autorelease就行了,无需再调用release!ClassA*obj1=[[[ClassAalloc]init]autorelease];//retaincount=1但无需调用release5.2对于存在指针赋值的情况,代码与前面类似。ClassA*obj1=[[[ClassAalloc]init]autorelease];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj2retain];//

oper 2016-05-23   2003   0
P27

  iphone开发手册 文档

一、路径规范1./private/var/mobile新刷完的机器,要在这个文件夹下建一个Documents的目录,很多程序都要用到。

1351767877 2014-12-11   2540   0
P19

  苹果应用程序发布流程:如何将应用上传到App Store的详细流程介绍 文档

苹果应用程序发布流程:如何将应用上传到AppStore的详细流程介绍

xlz98 2013-07-15   14440   0
P32

  iPhone界面设计指南 文档

  在深入研究iPhone界面的视图和控件之前,有必要理解这些元素的操作方式和隐喻含义。本文将介绍应用于大多数程序的视图,以及它们的属性和使用方式。

164145861 2013-03-13   2782   0
P13

  iphone开发,数据库_SQLite3_建表到使用简明教程 文档

SQLite顾名思议是以 SQL为基础的数据库软件,SQL是一套强大的数据库语言,主要概念是由「数据库」、「资料表」(table)、「查询指令」(queries)等单元组成的「关联性数据库」(进一步的概念可参考网络上各种关于SQL及关联性数据库的文件)。因为SQL的查询功能强大,语法一致而入门容易,因此成为现今主流数据库的标准语言(微软、Oracle等大厂的数据库软件都提供SQL语法的查询及操作)。 以下我们就建立数据库、建立资料表及索引、新增资料、查询资料、更改资料、移除资料、sqlite3命令列选项等几个项目做简单的介绍。

xhc 2012-12-22   428   0
P54

  iphone 开发笔记 文档

NSStringFromCGRect(someCG) 把CGRect结构转变为格式化字符串; CGRectFromString(aString) 由字符串恢复出矩形; CGRectInset(aRect) 创建较小或较大的矩形(中心点相同),+较小 -较大 CGRectIntersectsRect(rect1, rect2) 判断两矩形是否交叉,是否重叠 CGRectZero 高度和宽度为零的/位于(0,0)的矩形常量

sulibo 2012-07-16   2939   0
P3

  iPhone的Push功能原理浅析 文档

内容概要一、Push机制概括说明二、PUSH机制详细说明三、PUSH认证阶段是难点四、PSUH使用方法 一、Push机制概括说明Provider是指某个iPhone软件的Push服务器APNS是Apple Push Notification Service(ApplePush服务器)的缩写,下文统一使用该缩写。 

heqingshan 2012-07-13   583   0
P7

  iPhone开发笔记 Object-c基础 文档

类,Object-c中的类和Java中类的概念一样,需要注意的是一下几点: Object-c中的类一般在头文件中生声明,类是用@interface编译器指令来进行声明

guo_zyhd 2012-05-30   3588   0
P19

  iPhone 程式开发简略笔记 文档

iPhone 程式开发简略笔记

vacer 2012-02-21   450   0
P19

  在Windows中安装iPhone开发环境 文档

我将新版开发环境在Windows XP下VMWare虚拟机中安装开发环境过程贴出来,让大家分享。 本文在Windows Xp + VMware Workstation 7.0 + MAC OS X Snow Leopard 10.6 环境下安装iPhone SDK 3.1.2成功!

jelly0812 2012-01-12   480   0
P51

  iPhone开发进阶 文档

深入理解iPhone OS/SDK与Objective-C2.0。

fugary 2010-09-23   525   0

关键词

最新上传

热门文档