关闭

Memory Management Policy(内存管理政策)

279人阅读 评论(0) 收藏 举报
内存管理政策

  用于内存管理的基本模型采用引用计数的环境中提供的组合方法中定义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除外);
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8596次
    • 积分:444
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:10篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论