[objective-c]教程四-----内存管理(Memory Manage)

改定履历:

2012-4-26:--------------------------新建文本文档

2012-05-05:------------------------objective-c中,单独的"collection",意为"NSArry","NSDictionary"等这类"集合"容器.修正原来文中的错误翻译.个人认为翻译成"集合"或别的都不如"collection"来的准确,文中遇到即不再翻译.


正文:


objective-c是一门主要用于Apple's Mac OS X and iOS的面向对象编程语言.也是用于Apple Cocoa API的主要语言.本系列教程覆盖了objective-c的一些特定内容,包括:类,方法和内存管理.

本节原文地址

(译者注:IOS的内存都是在堆上开辟的)


objective-c提供了两种类型的内存管理.


1. 引用计数(Reference counting)(手工管理内存)

NSString* value = [[NSString alloc] init];

[value retain];
[value autorelease];

※ 当一个对象被分配内存空间后,其引用计数为1.

※ 开发者手动的对一个对象的引用计数增加或减少.

※ "retain"增加引用计数1;而"release"会减1.

※ 引用计数为0时对象会被删除,内存会被回收.


2.垃圾收集.(objective-c运行时自动管理内存)

※ objective-c运行时提供垃圾收集自动管理内存的选项.

※ 不需要引用计数的手工管理.

※ 支持Mac os X v10.5及以后版本.开发者应该为Max X开发基于垃圾收集机制的应用.

※ 不支持IOS.

※ 垃圾收集机制是代码编译时的可选特征(Garbage collection is an opt-in feature when compiling the code)

※ objective-c运行时将会决定任何一个对象没有被引用时释放它.(垃圾收集)



Objective-C 基于引用计数的内存管理


objective-c定义了一些基本的规则来决定"谁"应该释放一个对象.本指南提供了一份与基于引用计数的对象释放一致的编码惯例,在下列情况下,程序员有责任释放(release)或自动释放(autorelease)一个objective-c对象.

1. 某方法调用alloc, new, copy, 或 mutableCopy创建一个对象并返回该对象也应该释放(release)这个对象.

- getObject {
  NSString* v1 = [[NSString alloc] init];
  // 延迟对象V1的回收,直到方法调用链完成( Delay "v1" de-allocation until the complete method call chain is completed)
  [v1 autorelease];
  return v1;
}

※ autorelease并不立即回收对象内存.事实上,它会在整个方法调用链完成之后才会回收(free)内存.

※ 这会给调用者一个访问该对象的机会,而不用担心该对象已经释放(free--意为内存的回收)了自己.

id result = [myObject getObject];
// autorelease in getObject delay the deallocation
// Hence, it is still valid and accessible here
[result method1];
-----一定不要在getObject方法中去release该对象, 因为这将会回收该对象内存并导致接下来的调用无效.

2. 当一个对象做为另一个对象实例变量被赋值(set)的时候,正确地方法是实现一个"setter"方法管理引用计数

※ 在"setter"方法里release一个旧对象,retain新对象.

- (void) setValue: (NSString*)input
{
    [value autorelease];
    value = [value retain];
}

- (void) setValue: (NSString*)input
{
    [input retain];
    [value release];
    value = input;
}

- (void) setValue: (NSString*)input
{
    [value release];
    value = input;
    [value retain];
 }

※ 如果输入参数与要被"set"的对象是同一个对象, 上面的代码不会过早的回收对象.

3. 在某种情况下, 一个方法可能会调用用"retain"方法来增加对象的引用计数.

※ 在同一个方法里,即使不是必须的,它(retain)也应该与release或autorelease匹配使用.

// Increment the reference count by 1
[s retain];
...
[s autorelease];

4. 当一个对象被回收(deallocated)时,其实例变量对象也应被回收.

- (void) dealloc
{
    [value release];
    [super dealloc];
}

※ 除以下情况外,在方法内分配的对象通常是保证有效的:

(1) 对象被从"collection"中移除,对象被删除

(2) 类对象被释放(release),其实例变量也会被释放(release)

※ 增加到"collections"(NSArry,NSDictionary)中的objects或keys被从中移除的时候,仍然会被自动地retain和release.

Objective-C Autorelease

立即释放(release)回收(de-allocates)一个objective-c对象后,在将来引用该对象会是无效的."autorelease"将objective-c对象注册到"autorelease pool"中.实际上,"autorelease pool"存在于程序员创建的每一个X-code工程中."autorelease pool"中的对象只有在"pool"自己被释放的时候才会释放(release),而这通常是在方法调用链(the chain of method calls)完成之后才做的操作.这种推迟的释放(release)操作简化了返回对象给调用者的内存管理.

用于X-CODE工程的应用程序开发包在一个事件(例如一个"mouse down"事件)开始的时候会自动地创建一个"autorelease pool"(NSAutoreleasePool实例).该内存池会在该事件处理完成后"清空"(drain)一次.

下面的例子演示了如何管理从一个方法返回一个objective-c对象.

- myCallee {
  ...
  id newObject = [[NSString alloc] init];
  //在返回方法内分配的objective-c对象之前,应先"autorelease"
  [newObject autorelease];
  return newObject;
}
  • 方法以alloc,new,copy或者mutableCopy创建返回的对象,调用者拥有其所有权
  • 根据objective-c内存编码指南,该方法也有责任释放(release)这个对象.
  • 使用"autorelease"延迟释放(release),这样调用者仍然可以引用返回的对象.

调用者:

- myCaller {
  ...
  id obj = [myObject createANewInstance];
  // obj is still valid even autorelease is called (not true if myCallee make a message call like [newObject release])
  [obj someMehtod];
  // Does not need to call [myObject release];
}

※ 对象"obj"仍然是有效的,因为"autorelease"还没有真正释放(release)该对象.

※ 对象"obj"在"autorelease pool"被释放(release)后会被释放(release).

※ 对于一个X-CODE工程来说,"autorelease pool"会在相应的事件完成之后释放(release).

※ 因为该对象并非由调用者以alloc, new, copy, 或 mutableCopy创建返回的,根据objective-c编程指南,调用者方法无须对该对象的释放负责.

手动创建autorelease pool

应用开发包会自动处理autorelease.如果程序员需要自定义"autorelease pool",下面的例子演示了如何创建和销毁一个"autorelease pool".

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString* obj = [[NSString alloc] init];
    [obj autorelease];

    [pool drain];

引用计数的通用做法

※ 对本地对象来说:

(1) 如果本地对象是返回给调用者的,在返回(return)对象之前要"autorelease"它.

(2) 如果本地对象不是返回给调用者的,在返回(return)之前要"release"它.

※ 对于类实例变量来说,在"dealloc"中 "release"该实例变量.

在使用"setter"方法时,应谨慎对待引用计数

//下面是错误的使用例子.
- method1 {
  ...
  id newObject = [[NSString alloc] init];
  // Wrong. both init and the setter will increment the reference count to 2
  [self setValue:newObject];
  ...
}

//下面是正确的分配对象的例子

- method1 {
  ...
  id newObject = [[NSString alloc] init];
  // Set the instance variable directly
  value = newObject;
  ...
}

或者可以手动减少对象引用计数

- method1 {
  ...
  id newObject = [[NSString alloc] init];

  [self setValue:newObject];
  [newObject release];
  ...
}

"getter"方法的内存管理

objective-c可以为属性(property)声明自动的创建内存管理代码.

@property (retain) NSDate *value;

如果手动实现的话,如下:

- (NSString*) value {
    return [[value retain] autorelease];
}

objective-c collection类引用计数

for (i = 0; i < 5; i++) {
    NSNumber *n = [[NSNumber alloc] initWithInteger: i];
    [myArray addObject:n];
    [n release];
}
"addObject"会增加对象引用计数.

---------------

补充:

IOS不支持垃圾收集机制,仅适用于Mac 0S X v10.5 或以后版本.

垃圾收集缺省是关闭的.如果想启用该机制,使用以下代码编译:

-fobjc-gc-only

如果工程既使用垃圾收集也使用引用计数,用以下代码编译:

-fobjc-gc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值