Memory Management Policy(内存管理政策)

原创 2015年11月18日 10:18:49
内存管理政策

  用于内存管理的基本模型采用引用计数的环境中提供的组合方法中定义NSObject协议和标准方法的命名约定。dealloc NSObject类也定义了一个方法,这是自动调用对象时收回。本文描述了所有你需要知道的基本规则在可可程序正确地管理内存,并提供正确使用的一些示例。

基本内存管理规则

  内存管理模型是基于对象的所有权。任何对象可能有一个或多个用户。只要一个对象至少都有一个所有者,它继续存在。如果一个对象没有所有者,自动运行时系统会破坏它。确保很明显当你自己的对象,当你不这样做,可可制定以下政策:
1 你创建的任何对象
  你创建一个对象使用一个方法的名称始于“分配”、“新”、“复制”或“mutableCopy”(例如,alloc,newObject或mutableCopy)。
2 你可以使用保留对象的所有权
  收到的对象通常是保证仍然有效在方法中收到,这方法也可以安全地返回调用程序对象。你使用保留两种情况:(1)在访问方法的实现方法或者一个init方法,采取所有权要存储一个对象的属性值;和(2)防止对象失效的副作用其他操作(如解释避免引起你使用回收的对象)。
3 当你不再需要它,你必须放弃你所拥有的一个对象的所有权
  你放弃一个对象的所有权通过发送它生成自动发布消息或消息。在可可术语中,因此放弃一个对象的所有权通常称为“释放”对象。

4  你不能放弃你不拥有一个对象的所有权
  这只是推论之前的政策规定,明确规定。
一个简单的例子
  为了说明该政策,考虑下面的代码片段:
{
Person *aPerson = [[Person alloc] init];
// ...
NSString *name = aPerson.fullName;
// ...
[aPerson release];
}
  创建Person对象使用分配的方法,所以它是随后发布消息发送时不再需要。这个人的名字是不使用任何拥有检索方法,所以它不释放消息发送。值得注意的是,这些示例使用版本而不是生成。

  使用生成自动发送延迟释放
  你使用autorelease当你需要时发送延迟发布邮件通常从一个方法返回一个对象。例如,您可以实现fullName方法是这样的:
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
self.firstName, self.lastName] autorelease];
return string;
}
你拥有alloc返回的字符串。遵守内存管理规则,你必须放弃所有权的字符串之前失去了参考。如果你使用版本,然而,返回的字符串将被收回之前(和方法会返回一个无效的对象)。使用生成,您表示您想要放弃所有权,但你允许方法的调用者使用返回的字符串之前收回。

  你也可以实现fullName方法是这样的:
- (NSString *)fullName {
NSString *string = [NSString stringWithFormat:@"%@ %@",
self.firstName, self.lastName];
return string;
}
遵循的基本规则,你不自己stringWithFormat:返回的字符串,所以您可以安全地返回字符串的方法。

  通过对比,下面的实现是错误的:
- (NSString *)fullName {
NSString *string = [[NSString alloc] initWithFormat:@"%@ %@",
self.firstName, self.lastName];
return string;
}
  根据命名约定,没有什么表示,fullName方法的调用方拥有返回的字符串。调用者因此没有理由释放返回的字符串,并将因此被泄露。

  你不返回的对象的引用
  一些方法在可可指定返回一个对象的引用(也就是说,他们的论证类型名称* * *或id)。一个常见的模式是使用NSError对象,该对象包含一个错误的信息,如果一个发生,并所示:选择:错误:(NSData)和initWithContentsOfFile:编码:错误:(NSString)。

  在这些情况下,应用同样的规则已经被描述。当您调用这些方法中的任何一个,你不创建NSError对象,所以你不拥有它。因此不需要释放它,如本例中所示:
NSString *fileName = <#Get a file name#>;
NSError *error;
NSString *string = [[NSString alloc] initWithContentsOfFile:fileName
encoding:NSUTF8StringEncoding error:&error];
if (string == nil) {
// Deal with error...
}
// ...
[string release];
  实现dealloc放弃所有权的对象

  dealloc NSObject类定义了一个方法,调用时自动对象没有所有者,它的内存被可可术语是“释放”或“释放”。dealloc方法是自由的角色对象的内存,持有和处置任何资源,包括任何对象实例变量的所有权。

  下面的例子说明了如何实现一个dealloc Person类的方法:
@interface Person : NSObject
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (assign, readonly) NSString *fullName;
@end

@implementation Person
// ...
- (void)dealloc
[_firstName release];
[_lastName release];
[super dealloc];
}
@end
重要:不要直接调用另一个对象的dealloc方法。
  最后你必须调用超类的实现你的实现。
  你不应该将系统资源管理对象的生命周期;看到不使用dealloc管理稀缺资源。
  当一个应用程序终止,不得发送dealloc消息对象。因为进程的内存是在退出时自动清除,这是更有效的简单的允许操作系统清理资源比调用所有的内存管理方法。
核心基础使用相似但不同的规则

  也有类似的核心基础对象的内存管理规则(见内存管理为核心基础编程指南)。可可和命名约定的核心基础,然而,是不同的。特别是核心基金会创建规则(参见创建规则)不适用于返回objective - c对象的方法。例如,下面的代码片段,你不负责myInstance放弃所有权:

  MyClass * myInstance =(MyClass createInstance除外);
版权声明:本文为博主原创文章,未经博主允许不得转载。

玩转Bits和Bytes——Apache Flink的内存管理

(英文原文,慎入)Apache Flink在自己的框架中自己实现了内存管理和序列化/反序列化框架,很好的优化了数据程序在JVM上的内存使用。...
  • wzhg0508
  • wzhg0508
  • 2015年05月25日 16:06
  • 2447

深入理解Linux内存管理 - 物理内存

Linux存在于各种体系结构上,所以描述内存需要架构独立的方法。本章会描述用来管理memory bank,页框的数据结构以及那些影响VM行为的flags VM第一个重要的流行概念是Non Unifor...
  • kickxxx
  • kickxxx
  • 2013年02月27日 16:55
  • 8395

Linux NUMA memory policy(内存分配策略)

参考内核文档:Document/vm/numa_memory_policy memory policy是决定在NUMA系统上从哪个节点分配内存的策略,它是一类提供给能更好利用NUMA系统进行内存分配...
  • glmwu
  • glmwu
  • 2014年02月22日 17:59
  • 2345

内存管理策略(memory Management Policy)

内存管理策略(memory Management Policy) NSObject protocol中定义的的方法和标准命名惯例一起提供了一个引用计数环境,内存管理的基本模式处于这个环境中。NSO...
  • xsh841272293
  • xsh841272293
  • 2015年07月07日 10:43
  • 333

IOS内存管理策略(Memory Management Policy)

基本model用于内存管理在一个采用引用计数的环境是由方法组合定义的协议和标准方法NSObject命名约定。这个NSObject类还定义了一个方法,dealloc,这是调用一个对象时自动销毁。 ...
  • a854995785
  • a854995785
  • 2014年08月12日 18:55
  • 217

C_C++ 内存管理算法和实现 Memory Management Algorithms and Implementation in C_C++

  • 2007年06月10日 12:02
  • 5.47MB
  • 下载

MMU(Memory Management Unit,内存管理单元)的作用

转载地址:http://yunli.blog.51cto.com/831344/189787/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究...
  • wlanye
  • wlanye
  • 2013年04月04日 09:37
  • 621

内存管理 Memory Management for Android Apps

关键字: memory leak  heap is full Garbage Collection OutOfMemoryError 利用Eclipse Memory Analyze...
  • stefzeus
  • stefzeus
  • 2012年03月28日 13:52
  • 1335

Spark 1.6 内存管理模型( Unified Memory Management)分析

2016年1月4号 Spark 1.6 发布。提出了一个新的内存管理模型: Unified Memory Management。这篇文章会详细分析新的内存管理模型,方便大家做调优。 前言新的内存模型是...
  • allwefantasy
  • allwefantasy
  • 2016年01月09日 20:09
  • 2611

Android内存管理(Memory Management), OutOfMemoryError Note

原文链接:http://www.blogjava.net/zygcs/archive/2012/09/29/388847.html   Android框架强制每个进程的24 MB内存限制。...
  • zhao3546
  • zhao3546
  • 2013年08月31日 09:13
  • 3816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Memory Management Policy(内存管理政策)
举报原因:
原因补充:

(最多只允许输入30个字)