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除外);
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

给Unity开发者的C#内存管理(第二部分) C# Memory Management for Unity Developers (part 2 of 3)

【三部曲中的第一篇文章讨论了.NET/Mono以及Unity中的内存管理的基础,并且提供了一些避免不必要的堆内存分配的小提示。第三篇则讲了对象池。所有的内容都是面向“中级”C#开发者】 现在,来仔细...

wince系统内存管理 System Memory Management in Windows CE

Applies to:     Microsoft® Windows® CE .NET 4.1 and laterSummary: Learn about the design tradeoffs i...
  • lyx123
  • lyx123
  • 2011年03月09日 13:52
  • 985

Memory Management(5)DXE 内存管理流程

OS 也好或者UEFI Firmware 也好,都有各自的应用领域,为了更好的完成自己的角色,就会用适合自己的策略方法。由于UEFI Firmware 是现代化软件,所以有些思想和目前主流软件思想有类...
  • Pedroa
  • Pedroa
  • 2016年12月30日 23:10
  • 387

Memory management(内存管理)

Memory management: Overview(概述) 注意:Linux 使用glibc 函数,比如malloc,进行内存管理。要了解更多信息,请参考Linux 系统 关于malloc 的...
  • lclbc
  • lclbc
  • 2014年01月15日 16:42
  • 554

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

原文链接:http://www.blogjava.net/zygcs/archive/2012/09/29/388847.html   Android框架强制每个进程的24 MB内存限制。...

Oracle PGA内存管理 PGA Memory Management

Oracle PGA内存管理 PGA Memory Management
  • Seandba
  • Seandba
  • 2017年06月05日 09:39
  • 317

[iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)

应用程序的内存管理是程序运行时内存分配的过程,使用它,并当你用完它的时候释放它。写得好的程序应该尽可能少的使用内存。在Objective-C,它也可以被看作是分布 数据和代码的许多块当中的有限的内存资...

内存管理 Memory Management for Android Apps

关键字: memory leak  heap is full Garbage Collection OutOfMemoryError 利用Eclipse Memory Analyze...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Memory Management Policy(内存管理政策)
举报原因:
原因补充:

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